我经常看到test <blah>
表达式在示例中用于无限的while循环。例如while [ 1 ]; do echo "will loop endlessly"; done
。 [ 1 ]
与test 1
相同,但总是如此:
$ test 1
$ echo $?
0
$
然而,表达式不需要是整数,但也可以是单词,例如test [ blah ]
。为什么test [ 1 ]
或test [ blah ]
为真,即表达式不经过任何实际测试,是吗?
答案 0 :(得分:6)
使用-n
测试字符串是否为空是正确的:
test -n "$x"
并且1
和blah
是非空字符串,因此它们会给出真正的表达式。
但至少在测试变量时不建议这样做,因为变量可以包含对test
有效的运算符,结果可能会出乎意料。更喜欢使用-n
。
正如@Keith Thompson所建议的那样,如果要创建一个无限循环,最好只使用while true
或while :
,因为它写得更清楚,并且跳过不必要的测试表达式。
对于bash
,for (( ;; )); do
可能会更有效率,因为它不会调用另一个内置内容并且不会继续测试$?
。
答案 1 :(得分:1)
$ test ""; echo $?
1
所以可能'test'将任何非空字符串计算为成功(0), 和空字符串(“”)作为失败(1)。