Cranky
2016-01-31 19:40
关于if [[ ! ${execshell =~ ^[0-9]+} ]] 有几点不清楚的地方:
[[ ]] 两个中括号是什么意思?
=~ 这个又是什么意思?我查资料,正则表达式里面没有~符号啊?
^[0-9]+ 代表的是开头的字符最少一个是数字
但是我输入11111,也会匹配不上,正则表达式不是包含匹配的吗,11111开头的第一个数也是数字啊,为什么会匹配不上呢?
可以看下这个
http://www.cnblogs.com/include/archive/2011/12/09/2307905.html
1.加了双中括号[[ ]]以后,在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换,bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
在[[和]]之间支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。
2.简单来说,=~ 就是匹配正则表达式用的。
3.你的命令有问题if [[ ! ${execshell =~ ^[0-9]+} ]],这里大括号错误了,应该是这样if [[ ! ${execshell} =~ ^[0-9]+ ]],大括号是在execshell两边的,而且命令里面有!呀,表示的取反,输入11111后命令就是会返回false呀
第一个,已经找到答案了:
知道[[]]的意思了,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典型应用之主控脚本实现
37185 学习 · 39 问题
相似问题