由test -n/-z 引发的关于shell变量问题的探讨
2011-02-09 22:17
465 查看
这个名字貌似起的有点大,其实是自己在学习shell脚本时遇到的一个小问题。
有过shell脚本编写经历的同志都知道,在判断符号[]中的变量名最好用双引号括起,否则会可能会引起各种问题。例如[ -f "$filename"]
对于和判断符号相同的test命令其实也存在同样的问题。由于在编写脚本的时候test -n无法检测到空字符串,进行了如下测试:
(-n 字符串为非空时返回0值,-z 字符串为空时返回0值)
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=""
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. "" 和 '' 对于变量的影响不一样,前者中的$表示变量,后者中均为普通字符。
有过shell脚本编写经历的同志都知道,在判断符号[]中的变量名最好用双引号括起,否则会可能会引起各种问题。例如[ -f "$filename"]
对于和判断符号相同的test命令其实也存在同样的问题。由于在编写脚本的时候test -n无法检测到空字符串,进行了如下测试:
(-n 字符串为非空时返回0值,-z 字符串为空时返回0值)
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=""
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. "" 和 '' 对于变量的影响不一样,前者中的$表示变量,后者中均为普通字符。
相关文章推荐
- 关于shell变量的最长匹配问题
- 关于ansible远程执行的环境变量问题(login shell & nonlogin shelll)
- shell脚本中grep时关于变量带双引号的小问题
- shell中关于数字变量比较报错的问题
- C++全局变量初始化引发的问题
- 关于shell变量的基础概念
- 关于Sqlserver中变量的作用域和生存期问题
- 来谈谈关于Shell中效率的问题
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 关于Android studio 3.0 Failure [INSTALL_FAILED_TEST_ONLY]安装失败的问题
- 关于Action里面定义的变量问题
- 父shell和子shell 变量问题
- 关于进程和线程对于全局变量共享的问题学习总结
- 关于无默认构造函数的类的对象作为成员变量的问题
- 由crontab执行expect脚本问题引发的--crontab环境变量问题
- 一些关于path环境变量的问题
- 关于添加环境变量的一点问题
- 关于b=++b和b = b += 1的问题探讨
- 关于ExternalInterface的性能问题探讨。
- 关于参数变量可变的方法的问题??