LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1259|回复: 10

请教测试时加引号和不加引号的区别

[复制链接]
发表于 2007-9-21 16:27:26 | 显示全部楼层 |阅读模式
脚本内容如下:
if [ -n $xyz ]
then
  echo "xyz is true."
else
  echo "xyz is false."
fi

if [ -n "$xyz" ]
then
  echo "quote(xyz) is true."
else
  echo "quote(xyz) is false."
fi

exit 0
为何运行结果不加引号的为真,加引号的为假?
如果在脚本的最上面添加上
xyz=
的赋值语句,结果也是一样的。
发表于 2007-9-21 20:18:00 | 显示全部楼层
我判断空串一般用-z,-n则很少用也不敢乱解释,建议你找本shell的教程读读吧。
回复 支持 反对

使用道具 举报

发表于 2007-9-22 09:10:42 | 显示全部楼层
我试了一下也是这样,不过abs给的标准的例题就是用""来测试的。
回复 支持 反对

使用道具 举报

发表于 2007-9-22 23:51:55 | 显示全部楼层
没错啊。一般都用加“”这个来测试吧。
回复 支持 反对

使用道具 举报

发表于 2007-9-23 15:10:56 | 显示全部楼层
[[保留词就不需要引用。如果不考虑可移植性,[[比较不容易出错。
回复 支持 反对

使用道具 举报

发表于 2007-9-23 15:16:58 | 显示全部楼层
好奇怪啊,bash手册页中对于条件判断的 -z 和 -n 就是简单的几行:
  1.        -z string
  2.               True if the length of string is zero.
  3.        string
  4.        -n string
  5.               True if the length of string is non-zero.
复制代码
既然这两个解释是互为否的,那为什么会在相同测试下的结果出现不对称呢?
回复 支持 反对

使用道具 举报

发表于 2007-9-23 15:23:40 | 显示全部楼层
[ -z ] && echo True
[ -n ] && echo True

??
回复 支持 反对

使用道具 举报

发表于 2007-9-23 15:56:13 | 显示全部楼层
应该是这么解释吧

[, test (最早是外部命令,现在内置,外部也保留,两者表现是一样的),test -n测试nonzero string,是期待后面跟参数的。当$xzy为空时, [ -n "$xzy" ]扩展为[ -n "" ],是空字符串,语法是正确的,而[ -n $xyz ]扩展为[ -n ],也就是没有参数。有些shell会出现语法错误,test: argument expected.
回复 支持 反对

使用道具 举报

发表于 2007-9-23 16:08:09 | 显示全部楼层
最新的bash, zsh, (可能ksh93, pdksh也是一样) 无论$xyz为空还是unset,返回值总是0,所以一定要加双引号。
回复 支持 反对

使用道具 举报

发表于 2007-9-23 20:57:50 | 显示全部楼层
同意 ,在判断字符变量是否为空,是一定要加双引号的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表