Shell脚本测试

6

我将尝试翻译一段其他人编写的Bash脚本,并遇到了一行代码,不确定其具体含义。

请问有谁能告诉我以下检查的作用:

if [ :$RESULT != :0,0 ]

我猜它是在检查$RESULT中的某个值,可能是子字符串?

非常感谢您的帮助!

3个回答

13

[ 命令只是 test 命令的一个别名,右方括号只是语法糖(如果最后一个参数是右方括号,则 [ 命令将忽略它),因此该行实际上读作:

if test :$RESULT != :0,0

它比较字符串:$RESULT是否等于字符串:0,0。在变量$RESULT为空的情况下,冒号会被添加在前面。如果省略冒号并且$RESULT是一个空字符串,该行将如下所示:

if test  != 0,0

如果不在!=之前提供参数,则会导致错误。另一种方法是使用引号表示有一个参数,这个参数是一个空字符串:

if test "$RESULT" != 0,0
# Will become
if test "" != 0,0

你发布的这个变量更具可移植性。


尝试使用man bash命令并搜索内置命令test以获取更多信息。 - soulmerge
好的,我明白了,谢谢!那么它实际上是在与字符串“0,0”进行比较吗?我问这个问题是因为变量result永远不会有那个值!我想知道0,0是否还有其他作用。也许是一个空字符串? - LJ
不,0,0 是一个字符串,运算符 != 比较的是字符串,所以它检查 $RESULT 是否为字符串 0,0。尝试使用 man test 命令。 - soulmerge
刚刚做了一些小测试,你的确是完全正确的。谢谢! - LJ

5
我认为在变量为空的情况下,人们常常使用冒号:这个技巧。如果变量为空,那么shell会有以下结果:
if [  != 0,0 ]

这将是一个语法错误。在变量前面加上:的意思是,如果变量为空,shell会执行以下操作:

if [ : != :0,0 ]

这不是语法错误,会(正确地)报告 false。


1
有时你会看到一个 x 被用在和冒号类似的方式中,就像你的例子一样。
在 Bash 中进行这种类型的测试的首选方法是使用双方括号:
if [[ $RESULT != 0,0 ]]

双括号形式提供更多的灵活性,改善了可读性,减少了转义和引用的需求,并提供了一些其他功能。请参见this page以获取更多信息。

如果您想测试数字值,而不是字符串或文件,请使用双括号:

if (( 3 + 4 > 6 ))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接