3


1

KornShellのテストコマンド(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 Answer


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


しかし、とにかくあなたのコードには欠陥があります。

temp = `ps -aef | grepくそー| wc -l`は常に少なくとも1を返します。これは、grepコマンドと先頭にスペースが埋め込まれた文字列を見つけるためです。これが両方のテストに当てはまる理由です。

wcへのパイピングも不要です。grepの-cスイッチが役に立つからです。

より良いコードは次のとおりです。

temp = `ps -aef | grep damn | grep -cv grep`これは、damn文字列を含むプロセスの実行中のインスタンスの数を返し、それは数値になります。


0


ksh93とGNU coreutils expr 7.4を使用してコマンド:

myCount=`expr $myCount+ 0`

構文エラーが発生し、 myCount`をnullに設定すると、両方の if`ステートメントが "ksh:[:argument expected"エラーを出力します。 プラス記号の前にスペースを入れてみてください。 また、 `]`の前にスペースが必要です。

myCount`や temp`を整数に変換する必要はありません。 「expr」を使用した「myCount」の強制は完全に不要です。

整数を比較するためにこの形式を好むのは、 -ne`と -gt`の代わりに `!=`と `>`などの記号比較演算子を使用できるためです。

if (( $temp != $myCount ))