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)
想知道为什么也没有错误。
在 中ksh
,内置函数在算术上下文中[
采用-eq
as的操作数,就像 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
,[[
可以工作。