我正在尝试调试现有程序并发现 if 条件没有 $ 符号作为前缀。
值为:
dt_val=1234
prev_dt_val=1234
如果条件是这样的:
if [ dt_val -eq prev_dt_val ]
then
echo "Equal"
else
echo "Not equal"
fi
Result:
Equal
有人能解释一下在没有 $ 符号的情况下条件如何正常工作吗?
难道不应该是..?
[ $dt_val -eq $prev_dt_val ]
比较字符串值时,相同的条件失败。这是否意味着,这个条件不需要 $ 符号作为数字?
附加信息:
按照建议将字符串与 == 进行比较:
dt_val="abcd"
prev_dt_val="abcd"
if [ dt_val == prev_dt_val ]
> then
> echo Equal
> else
> echo Not equal
> fi
Not equal
外壳信息:
echo $SHELL
/usr/bin/ksh
Version M-11/16/88f
想知道为什么没有错误。
答案1
在 中ksh
,内置函数在算术上下文中[
采用 as 的操作数-eq
,就像 Bash 对[[
and所做的那样-eq
。在算术上下文中,变量不需要符号$
。
$ ksh -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=1 b=2; if [ a -eq b ]; then echo equal; else echo different; fi'
different
甚至:
$ ksh -c 'a=2 b=8; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=2 b=9; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
different
(但是,*
仍然是通配符,所以a*4
应该在那里引用。)
ksh --version
显示的是 ksh93 sh (AT&T Research) 93u+ 2012-08-01
,它来自 Debian 的软件包(ksh
软件包版本93u+20120801-3.1
)。我用 Debian 得到了相同的结果mksh
,所以我认为 ksh88 在这里足够接近。
作为比较,在 Bash 中会出现错误:
$ bash -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
bash: line 0: [: a: integer expression expected
different
(它打印different
,因为[
出错时返回一个假值)。
有了[[
它的作品:
$ bash -c 'a=1 b=1; if [[ a -eq b ]]; then echo equal; else echo different; fi'
equal
Zsh 就像这里的 Bash,[
出错了a -eq b
,[[
可以工作。
答案2
首先,脚本没有评估变量,因为它缺少$
变量名称前面的 ,就像您也发现的那样。
-eq
其次,它输出“Equal”,因为它在test
( [
) 命令中使用了数字比较运算符。由于它传递了两个非数字字符串作为参数,因此它们的计算结果都是相同的数值,因此输出“Equal”字符串。
请注意,至少 bash 版本会抱怨:
$ if [ 0 -eq bla ]; then echo yes; fi
-bash: [: bla: integer expression expected
我的破折号版本也抱怨:
$ if [ 0 -eq bla ]; then echo yes; fi
dash: 1: [: Illegal number: bla
我感兴趣的是你使用的什么 shell 不会抱怨。
即使这些字符串的名称存在变量,我也会得到相同的结果。