此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
当你在脚本中写入位置变量的时候,如果忘记在执行脚本后面跟上 参数的时候,
会报错又麻烦,那么如何让脚本提醒用户添加位置变量的参数呢??
root@zhengzelin:~# vim test.sh
[ $# -ne 2 ] && echo -e "\e[1;32m您输入的位置变量的参数不够脚本里的所有位置变量,请重新输入....\e[0m" && exit
echo "this is $1"
echo "this is $2"
exit
root@zhengzelin:~# ./test.sh 1 2 3
您输入的位置变量的参数不够脚本里的所有位置变量,请重新输入....
root@zhengzelin:~# ./test.sh 1 2
this is 1
this is 2
但是还不够严谨,因为这 只是指定了 位置变量参数的个数!并没有指定 位置变量参数的类型!
如果我这边的位置变量需要你填写 字符串,而你却使用了数字;
虽然个数与脚本内的位置变量个数一样,但是与我要求的字符串类型不一样,那也是不行的!
这样解决: 使用字符串测试符: =~
[ $# -ne 2 ] && echo -e '\e[1;33m请您确认您所输入的位置变量的参数是否为2两个!\e[0m' && exit
sleep 2
[[ $1 =~ ^[0-9]+$ ]] || exit
# 要求第一个位置变量必须为:纯数字,不是则推出
sleep 2
[[ $2 =~ ^[a-z]+$ ]] || exit
# 要求 第二个位置变量必须为:纯小写字母,不是则推出
echo " 这是第一个变量:$1"
echo " 这是第二个变量: $2"
但是上面的虽然没问题,但是不够完美,但是不像一开始那样可以在你输错“位置变量参数” 的时候给你提示信息:
失败方法1:
root@zhengzelin:~# vim test.sh
[ $# -ne 2 ] && echo -e '\e[1;33m请您确认您所输入的位置变量的参数是否为2两个!\e[0m' && exit
sleep 2
[[ $1 =~ ^[0-9]+$ ]] || echo "第一个字段必须为纯数字...";exit
sleep 2
[[ $2 =~ ^[a-z]+$ ]] || echo "第二字段必须为纯小写字母" || exit
echo " 这是第一个变量:$1"
echo " 这是第二个变量: $2"
使用 bash -x 检查一下:
root@zhengzelin:~# bash -x ./test.sh 102 2
+ '[' 2 -ne 2 ']'
+ sleep 2
+ [[ 102 =~ ^[0-9]+$ ]]
+ exit
当 第一个位置变量参数 102 满足 [[ 102 =~ ^[0-9]+$ ]] 这个条件的时候;
他直接执行了 exit!但是并没有执行 “echo "第一个字段必须为纯数字...";”
说明 bash 并没有将 exit 和 echo "第一个字段必须为纯数字..." 当成一个整体去执行!
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
失败方法2:
root@zhengzelin:~# vim test.sh
[ $# -ne 2 ] && echo -e '\e[1;33m请您确认您所输入的位置变量的参数是否为2两个!\e[0m' && exit
sleep 2
[[ $1 =~ ^[0-9]+$ ]] ||echo "第一个字段必须为纯数字..." || exit
sleep 2
[[ $2 =~ ^[a-z]+$ ]] ||echo "第二字段必须为纯小写字母" || exit
echo " 这是第一个变量:$1"
echo " 这是第二个变量: $2"
root@zhengzelin:~# ./test.sh 102 a
这是第一个变量:102
这是第二个变量: a
# 上面的是你位置变量参数输对的时候,如果输错你试试结果???
root@zhengzelin:~# ./test.sh abc 123
第一个字段必须为纯数字...
第二字段必须为纯小写字母
这是第一个变量:abc
这是第二个变量: 123
# 发现,虽然执行了 " echo 中的报错信息 ",但是却没有执行 exit,这是因为我用的 || 并不是 && 。
不过如果换成 && 的话,根据短路的意思理解:
[[ $1 =~ ^[0-9]+$ ]] ||echo "第一个字段必须为纯数字..." && exit
当 前面的表达式 为 flase 的时候,然后执行 echo .... ,接着 && 前的 echo 这个命令为 true,所以 && 后的 exit 也就不再执行了!
那么 && 和 || 都不能用,那么该怎么办????
成功解决办法:
root@zhengzelin:~# vim test.sh
[ $# -ne 2 ] && echo -e '\e[1;33m请您确认您所输入的位置变量的参数是否为2两个!\e[0m' && exit
sleep 2
[[ $1 =~ ^[0-9]+$ ]] || { echo " 第一个必须为 纯数字!";exit; }
[[ $2 =~ ^[a-z]+$ ]] || { echo "第二个数字必须为 纯小写英文"; exit; }
# 使用 { } 给他们括起来,并且 exit 后面需要加上分号;
echo " 这是第一个变量:$1"
echo " 这是第二个变量: $2"
exit
# 当然你可能会想 ( ) 和 { } 都是将多个命令合并在一起!但是这里为什么不能使用() 呢?
这是因为在shell脚本中()会开启一个子shell,当你里面有exit命令的时候,使用()来括起来,它只能表示退出当前子shell!!!
root@zhengzelin:~# ./test.sh 1
请您确认您所输入的位置变量的参数是否为2两个!
root@zhengzelin:~# ./test.sh 1 2
第二个数字必须为 纯小写英文
root@zhengzelin:~# ./test.sh abc abc
第一个必须为 纯数字!
也使用 if 可以实现
root@zhengzelin:~# vim test.sh
[ $# -ne 2 ] && echo -e '\e[1;33m请您确认您所输入的位置变量的参数是否为2两个!\e[0m' && exit
sleep 2
if [[ ! $1 =~ ^[0-9]+$ ]];then
echo " 第一个必须为 纯数字!";exit
fi
echo " 这是第一个变量:$1"
echo " 这是第二个变量: $2"
root@zhengzelin:~# ./test.sh 1v2 b
第一个必须为 纯数字!
root@zhengzelin:~# ./test.sh 12 b
这是第一个变量:12
这是第二个变量: b