引号与不按套路出牌

本文主要内容:

  • 说服自己在字符串比较时,都要加上双引号!避免意外的发生!

  • 在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!

  • 不按套路出牌的脚本示例

在做字符串比较比较时,都要加上双引号!避免意外的发生!

在开始之前,我们还得学习一下引号的使用,what?引号的使用不是再刚开始学脚本的时候就已经 学习了吗?对此,我之前对你说,太年轻,shell脚本的世界里引号的使用绝非那么简单!

我们在前面讲过了条件测试时的格式,说了它对中括号情有独钟,但是对里面的引号问题还没有深入学习!我们下面就来学习一下,come on -------->!

那么在条件测试判断里面什么时候该用双引号?什么时候不用加双引号呢?一言以蔽之:当其是字符串的时候当用双引号,当其是正则表达式千万不能用双引号!

先说第一条:做字符串比较判断时当用引号把字符串引起来。

-z是问变量内部是空的吗?是空的返回0,不是空的返回1

-n是问变量内部不是空的吗?不是空的的返回0,是空的返回1

[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -z $a ];echo $?     #不是空的返回1
1
[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -z $a ];echo $?    #是空的返回0,在-z时用不用引号没什么影响!
0
[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -n $a ];echo $?  #what?这里问它不是空的吗?这里的a是空的,应该返回为1,但是却返回了0!     -n时就出了问题! 使用引号可解决这种不正常。
0
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -n $a ];echo $?  #
0

######################我是加引号与不加引号的分隔线#########################

[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -n "$a" ];echo $?       #看这就变正常了
1
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -n "$a" ];echo $?
0

结论:

做字符串的判断时,在中括号内部都要加上引号,避免意外的发生,将意外扼杀在萌芽之中!

在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!

[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
0
[root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
0
[root@linuxprobe ~]# a=1b1
[root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
1
[root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
1

如果要使用扩展的正则表达式就必须得使用双中括号,而且还得使用专门的判断符号=~,在字符串比较里面是不支持标准的正则表达式的!一用就报错(我就是你,你还不相信吗?)

数字用扩展的正则表达式如果表示?就是用^[[:digit:]]+$ ]或者^[0-9]+$ ]]都可以,此种方法可以用来判断是否变量是否为正整数,下面的脚本会上这种判断方法。

不按套路出牌的脚本示例:

下面我们来完善添加用户的那个脚本,上一个脚本把人相像的太简单了,对于不按套路出牌的用户怎么应对呢?

原脚本:

#!/bin/bash
#author:zhanghe
read -p "please input one username prefix:" PREFIX
read -p "please input creat user number:" NUMBER
for i in `seq $NUMBER`;do
user=$PREFIX$i
if ! id $user &>/dev/null;then
useradd $user &>/dev/null
echo 123 | passwd --stdin $user &>/dev/null
chage -d 0 $user
echo "$user 已经添加~,密码默认为123,已经强制用户第一次登录修改密码"
else
echo "$user已经存在,无需添加!"
fi
done

修改后的脚本:

[root@linuxprobe scripts]# vim useradd.sh
#!/bin/bash
#author:zhanghe
read -p "please input one username prefix:" PREFIX
if [ -z "$PREFIX" ];then
echo "error PREFIX"
exit 1
fi
read -p "please input creat user number:" NUMBER
if [[ ! "$NUMBER" =~ ^[[:digit:]]+$ ]];then
echo "error number! ,you must input signless integer"
exit 2
fi
for i in `seq $NUMBER`;do
user=$PREFIX$i
if ! id $user &>/dev/null;then
useradd $user &>/dev/null
echo 123 | passwd --stdin $user &>/dev/null
chage -d 0 $user
echo "$user 已经添加~,密码默认为123,已经强制用户第一次登录修改密码"
else
echo "$user已经存在,无需添加!"
fi
done
原文地址:https://www.cnblogs.com/yizhangheka/p/11039080.html