2

以下のスクリプトでは、出力が msg_y and msg_z. しかし、それは印刷していmsg_x and msg_zます。誰かが私に何が起こっているのか説明できますか?

#!/bin/bash
 set -x

vr=2
echo $vr
if [ $vr > 5 ]
then
        echo "entered 1st if"
        echo "msg_x"

        echo "out of 1st if"

        if [ $vr < 8 ]; then
        echo "in of 2nd if"
        echo "msg_y"

        else
        echo "msg_z"
        fi

else
        if [ $vr > 1 ]; then echo "msg_y"

        else echo "msg_z"
        fi
fi
4

1 に答える 1

6

この表現

[ $vr > 5 ]

出力リダイレクトとして解析されています。「5」という名前のファイルがあるかどうかを確認してください。出力のリダイレクトは空虚に真実です。テスト式内でパラメータを引用するという通常の警告は、ここでは役に立たないことに注意してください (ただし、それでも良い考えです)。

をエスケープして>、テスト コマンドで演算子として表示することができます。

if [ "$vr" \> 5 ]; then

または、整数比較演算子を使用できます-gt

if [ "$vr" -gt 5 ]; then.

bash使用しているため、より堅牢な条件式を使用できます

if [[ $vr > 5 ]]; then

また

if [[ $vr -gt 5 ]]; then

または算術式を使用する

if (( vr > 5 )); then

比較を行います(他の場合も同様です)。


注:>整数で囲まれている場合でも比較演算子として機能させる方法を示しましたが、これは行わないでください。ほとんどの場合、引数は数値ではなく辞書式に比較されるため、必要な結果は得られません。[ 2 \> 10 ] && echo What?正しい整数比較演算子 ( -gtet al.) を使用するか、算術式を使用してください。

于 2013-02-27T18:14:50.503 に答える