Shell 科恩希尔(ksh)中的测试命令

Shell 科恩希尔(ksh)中的测试命令,shell,unix,testing,ksh,Shell,Unix,Testing,Ksh,我对KornShell(ksh)中的测试命令有一个问题。我知道-ne用于比较整数和=用于比较字符串。如果一个参数是字符串,另一个是整数,test命令将如何运行?我的代码中有以下条件,两者都正常工作 代码: myCount=1 myCount=`expr $myCount+ 0` temp=`ps -aef | grep damn | wc -l` if [ $temp -ne $myCount]; then echo ERROR Number fi if [ $temp !=

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

代码:

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
输出:

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

该类型不相关,因为它是一个简单的文本替换。换句话说,变量
$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
都是如此


基于此,我将尝试确保对字符串使用字符串比较,对数字使用数字比较。其他任何东西都可能是不可移植的。

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

myCount=`expr $myCount+ 0`
给我一个语法错误,并将
myCount
设置为null,这会导致
if
语句输出“ksh:[:预期参数”错误。请尝试在加号前加一个空格。此外,在
]之前需要有一个空格

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

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

if (( $temp != $myCount ))

但是你的代码还是有缺陷的

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

由于grep的-c开关将对您起作用,因此到wc的管道也是不必要的

更好的代码应该是:

temp=
ps-aef | grep dam | grep-cv grep

它将返回包含该该死字符串的进程的运行实例数,它将是一个数字。

您的意思是,如果[$temp-eq$myCount];然后回显错误字符串fi将始终打印消息,只要temp的值不是数字。不完全是,请参阅更新。如果数字以数字开头,但包含非数字,则会出错。对于不以数字开头的变量,它被视为0。在我的shell上,$export s1=xyz$export s2=7xyz$export i1=0$if[$i1-eq$s1]>then>echo equal>fi$xyz:bad有趣的是,完全相同的代码在我的版本上工作,所以我更新了答案,基本上是“不要这样做”:-)在此上下文中不必使用
export