测试结构中比较的退出状态

测试结构中比较的退出状态

我正在写一些“如果那么”的陈述,发现在我看来这是一种奇怪的行为。经过调查,我意识到这归结为我正在进行的比较的退出代码。我在下面的代码片段中说明了我的发现。

如你看到的

rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"

输出

es_num is 1
es_str is 0

是否有任何文档(最好来自 POSIX 标准)讨论测试构造的退出状态-eq和内部的差异?=

写条件语句时应该注意什么?对此有哪些最佳实践?

可移植代码比 Bash 代码(我正在使用)更可取。

答案1

-eq

如果整数 n1 和 n2 在代数上相等,则为 True;否则为假。

测试

=

如果字符串 s1 和 s2 相同,则为 True;否则为假。

测试

因此-eq比较整数并=比较字符串(这也适用于某些有限的整数情况)。


不过你确实有一个语法问题,它应该是:

[ "$rc" = 0 ]

并不是

[ $rc=0 ]

[ "$rc" = 0 ] 应该rc由于不等于 0,因此以 1 退出

[ $rc=0 ]实际上应该以 0 退出,因为它可能会被视为字符串,并且[测试构造中字符串的存在将评估为 true


sh[测试有一些差异:

# leading 0
$ [ 01 -eq 1 ]; echo $?
0
# adjacent whitespace
$ [ ' 1' -eq 1 ]; echo $?
0
# negative 0 vs positive 0
$ [ 0 -eq -0 ]; echo $?
0

然而,通过 bash[[测试,存在大量差异(包括上面提到的):

# base 8
$ [[ 032 -eq 26 ]]; echo $?
0
# Arithmetic expressions
$ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
0
# Base 64
$ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
0

答案2

对于数字比较,您必须使用-eqwhile=来进行字符串比较(从您似乎已经知道的变量命名来看)。

我所知道的关于testaka命令的最好的介绍之一是[Unix Shell 的谦虚如果

相关内容