没有 $ 符号的 Unix AIX 变量?

没有 $ 符号的 Unix AIX 变量?

我正在尝试调试现有程序并发现 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 不会抱怨。

即使这些字符串的名称存在变量,我也会得到相同的结果。

相关内容