一个没有 $ 符号的 Unix AIX 变量?

San*_*Ram 3 ksh aix test numeric-data variable

我正在尝试调试现有程序并找到一个没有 $ 符号前缀的 if 条件。

值是:

dt_val=1234
prev_dt_val=1234
Run Code Online (Sandbox Code Playgroud)

如果条件如下:

if [ dt_val -eq prev_dt_val ]
then
  echo "Equal"
else
  echo "Not equal"
fi

Result:
Equal
Run Code Online (Sandbox Code Playgroud)

有人对没有 $ 符号的情况如何正常工作有所了解吗?
不应该是..吗?

[ $dt_val -eq $prev_dt_val ]
Run Code Online (Sandbox Code Playgroud)

比较字符串值时,相同的条件失败。这是否意味着,此条件不需要数字的 $ 符号?

附加信息:
按照建议将字符串与 == 进行比较:

dt_val="abcd"
prev_dt_val="abcd"

if [ dt_val == prev_dt_val ]
> then
> echo Equal
> else
> echo Not equal
> fi
Not equal
Run Code Online (Sandbox Code Playgroud)

外壳信息:

echo $SHELL
/usr/bin/ksh
Version M-11/16/88f
Run Code Online (Sandbox Code Playgroud)

想知道为什么也没有错误。

ilk*_*chu 5

在 中ksh,内置函数在算术上下文中[采用-eqas的操作数,就像 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
Run Code Online (Sandbox Code Playgroud)

甚至:

$ 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
Run Code Online (Sandbox Code Playgroud)

(但是,*仍然是 globs,所以a*4应该在那里引用。)

那是 ksh93,ksh --version显示sh (AT&T Research) 93u+ 2012-08-01,它来自 Debian 的包 ( ksh, package version 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
Run Code Online (Sandbox Code Playgroud)

(它打印different,因为[在错误时返回一个假值)。

随着[[它的工作原理:

$ bash -c 'a=1 b=1; if [[ a -eq b ]]; then echo equal; else echo different; fi'
equal
Run Code Online (Sandbox Code Playgroud)

Zsh 就像这里的 Bash,[在 上出错a -eq b[[可以工作。