Bash Shell 脚本中使用 位置变量时候:提醒用户输入 位置变量的参数 以及位置变量参数的类型!


 

        此链接通往 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
 

你可能感兴趣的:(shell,字符串,shell,linux)