KornShell中的测试命令(ksh)

时间:2010-10-27 14:15:31

标签: shell unix testing ksh

我对KornShell(ksh)中的测试命令有疑问。我知道-ne用于比较整数,!=用于比较字符串。如果一个参数是一个字符串而另一个是整数,那么测试命令将如何表现?我的代码中有以下条件,两者都正常工作。

代码:

myCount=1
myCount=`expr $myCount+ 0`
temp=`ps -aef | grep damn | wc -l`
if [ $temp -ne $myCount]; then
        echo ERROR Number
fi

if [ $temp != $myCount ]; then
        echo ERROR Strings
fi

输出:

ERROR Number
ERROR Strings

3 个答案:

答案 0 :(得分:1)

类型不相关,因为它是一个简单的文本替换。换句话说,变量$temp的值将替换为$temp(例如)。

至少对于我正在运行的ksh版本,对于数值比较,如果值以非数字开头,则它将等于0.如果它以数字开头但包含非数字数字,你会得到一个错误。

例如:

$ export s1=xyz
$ export s2=7xyz
$ export i1=0
$ if [ $i1 -eq $s1 ]
> then
>     echo equal
> fi
equal
$ if [ $i1 -eq $s2 ]
> then
>     echo equal
> fi
ksh: 7xyz: bad number `7xyz'

但是,根据您的评论,ksh的所有版本可能并非如此。

基于此,我会尝试确保您使用字符串比较进行字符串和数字的数字比较。其他任何东西都可能是不便携的。

答案 1 :(得分:1)

但是你的代码仍有缺陷。

温度= ps -aef | grep damn | wc -l 将始终返回至少1,因为它将找到grep命令以及填充前导空格的字符串,这就是为什么两个测试都是真的。

管道到wc也是不必要的,因为grep的-c开关对你来说很重要。

更好的代码是:

温度= ps -aef |grep damn |grep -cv grep 这将返回包含该死的字符串的进程的运行实例数,它将是一个数字。

答案 2 :(得分:0)

使用ksh93和GNU coreutils expr 7.4你的命令:

myCount=`expr $myCount+ 0`

给我一​​个语法错误并将myCount设置为null,这会导致两个if语句输出“ksh:[:argument expected”错误。尝试在加号前加一个空格。此外,]之前需要有一个空格。

您不需要将myCounttemp转换为整数。使用myCount强制expr是完全没必要的。

我更喜欢这种形式来比较整数,因为它允许您使用符号比较运算符,例如!=>,而不是-ne-gt

if (( $temp != $myCount ))