Shell 科恩希尔(ksh)中的测试命令
我对KornShell(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 !=
-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 coreutilsexpr
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
。