我正在写一些“如果那么”的陈述,发现在我看来这是一种奇怪的行为。经过调查,我意识到这归结为我正在进行的比较的退出代码。我在下面的代码片段中说明了我的发现。
如你看到的
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
对于数字比较,您必须使用-eq
while=
来进行字符串比较(从您似乎已经知道的变量命名来看)。
我所知道的关于test
aka命令的最好的介绍之一是[
Unix Shell 的谦虚如果