关于 if [[ ! ${execshell =~ ^[0-9]+} ]] 有几点不清楚的地方?

来源:2-2 Shell脚本之场景控制脚本(下)

Cranky

2016-01-31 19:40

关于if [[ ! ${execshell =~ ^[0-9]+}  ]] 有几点不清楚的地方:

[[ ]] 两个中括号是什么意思?

=~ 这个又是什么意思?我查资料,正则表达式里面没有~符号啊?

^[0-9]+ 代表的是开头的字符最少一个是数字

但是我输入11111,也会匹配不上,正则表达式不是包含匹配的吗,11111开头的第一个数也是数字啊,为什么会匹配不上呢?


写回答 关注

3回答

  • 慕工程3931867
    2017-02-06 19:19:49

    可以看下这个

    http://www.cnblogs.com/include/archive/2011/12/09/2307905.html


  • 练习册
    2016-06-21 11:17:55

    1.加了双中括号[[ ]]以后,在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换,bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

    在[[和]]之间支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。

    2.简单来说,=~ 就是匹配正则表达式用的。

    3.你的命令有问题if [[ ! ${execshell =~ ^[0-9]+}  ]],这里大括号错误了,应该是这样if [[ ! ${execshell} =~ ^[0-9]+  ]],大括号是在execshell两边的,而且命令里面有!呀,表示的取反,输入11111后命令就是会返回false呀


  • Cranky
    2016-02-02 11:42:16

    第一个,已经找到答案了:

    知道[[]]的意思了,if [[]]中引用变量不用加 双引号(")了,而if[]中变量必须加双引号,如if[ -n "$test" ],不然一些特殊的地方,会出现问题的:

    例如:

    read -p "Please input number :" execshell

    teset=$(echo $execshell | sed 's/[0-9]//g')

    if [[ -n $test ]];then

    #这里写成 if [ -n $test ] 和 if [ -n "$test" ] && if [[ -n $test ]] 效果是不一样的。

    exit 1

    else

    exit 0

    fi

    这里如果写成if [ -n $test ],键盘输入: 0 , 然后用echo $? 会输出 1 (按程序来说不应该如此,如果是输入0的话,test的值应该为空才是,$?应该输出0才对,所以像if [ -n  $test ]这样写不对,引用变量在[]中,必须加双引号,或者用[[]]可以不加双引号),而写成 if [ -n "$test" ] 或者 if [[ -n $test ]],键盘输入0,然后用echo $? 才会输出 0,这样才会达成程序的要求。

    第三个,是我看漏了:

    ^[0-9]+ 代表的是开头的字符最少一个是数字

    但是我输入11111,也会匹配不上,正则表达式不是包含匹配的吗,11111开头的第一个数也是数字啊,为什么会匹配不上呢? 

    没看到elif 后面的语句,说的是如果键盘输入的数字大于文件数就退出,所以如果输入11111确实匹配上了,但是因为大于文件总数所以退出了。


    但是:第二个 =~ 还是没搞懂是什么意思??? 

Shell典型应用之主控脚本实现

应用shell实现案例主控脚本,握如何编写主控脚本

37196 学习 · 39 问题

查看课程

相似问题