为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

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

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

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


正在回答

3 回答

可以看下这个

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


0 回复 有任何疑惑可以回复我~

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

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

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

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


0 回复 有任何疑惑可以回复我~

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

知道[[]]的意思了,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确实匹配上了,但是因为大于文件总数所以退出了。


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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信