由test -n/-z 引发的关于shell变量问题的探讨

这个名字貌似起的有点大,其实是自己在学习shell脚本时遇到的一个小问题。

 

有过shell脚本编写经历的同志都知道,在判断符号[]中的变量名最好用双引号括起,否则会可能会引起各种问题。例如[ -f "$filename"]

对于和判断符号相同的test命令其实也存在同样的问题。由于在编写脚本的时候test -n无法检测到空字符串,进行了如下测试:

(-n 字符串为非空时返回0值,-z 字符串为空时返回0值) 

zzc@zzc-laptop:~/scripts$ test -n $perm
zzc@zzc-laptop:~/scripts$ echo $?

zzc@zzc-laptop:~/scripts$ test -z $perm
zzc@zzc-laptop:~/scripts$ echo $?
0
zzc@zzc-laptop:~/scripts$ perm=""
zzc@zzc-laptop:~/scripts$ test -n $perm
zzc@zzc-laptop:~/scripts$ echo $?
0
zzc@zzc-laptop:~/scripts$ test -z $perm
zzc@zzc-laptop:~/scripts$ echo $?
0
zzc@zzc-laptop:~/scripts$ perm="s"
zzc@zzc-laptop:~/scripts$ test -z $perm
zzc@zzc-laptop:~/scripts$ echo $?
1
zzc@zzc-laptop:~/scripts$ test -n $perm
zzc@zzc-laptop:~/scripts$ echo $?
0

但是如果在调用时将$perm用""括起,则工作正常。

 

问题是这样产生的。由上述bash测试结果可以看出,问题仅出在字符串为空的情况,当$perm为空时:

test -n $perm 等价于 test -n
test -z $perm 等价于 test -z

test -n 与 test -z 相当于对-z,-n进行字符串检测,即test将命令选项理解为了命令参数。

而test不带选项是等价于test -n的,所以以上两条命令均返回0值,即字符串非空。

加上""之后,test命令便知道传入的参数为空字符串,-n/-z为命令选项,执行便不会出错了。

 

其实,这类问题都是由于Bash的变量替换机制引起的,我们在学习C语言的过程中,接触到宏的时候也经常碰到这样的问题,这时候可以通过多使用()来避免问题,同样的在使用shell时,对变量多使用""也是避免错误的好选择。

 

 

 

P.S. "" 和 '' 对于变量的影响不一样,前者中的$表示变量,后者中均为普通字符。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值