1

私はこれを行う必要があります:

if [ $X != "dogs" and "birds" and "dogs" ]
then
    echo "it's is a monkey"
fi

bash スクリプトで。どうやって進める?

4

4 に答える 4

3

&&各オプションを個別の条件式に変換し、それらを(AND) 演算子で結合する必要があります。

if [[ $X != dogs && $X != birds && $X != cats ]]; then
  echo "'$X' is not dogs or birds or cats.  It must be monkeys."
fi

単一の[...]でこれを行うこともできますが、比較ごとに個別のセットを使用し、 and 演算子をそれらの外に移動する必要があります。

if [ "$X" != dogs ] && [ "$X" != birds ] && [ "$X" != cats ]; then
   ...
fi

のような単一単語の文字列を二重引用符で囲む必要はありませんが、パラメーターの値にスペースがあると構文エラーが発生するため、単一ブラケット バージョン内のdogsようにパラメーター展開 (変数) を二重引用符で囲む必要があることに注意してください。$X引用符なしで。

Xまた、シェル スクリプトのように大文字の変数名を使用する必要はありません。これは、環境から入ってくる変数などのために予約するのが最適$PATHです$TERM

OR のシェル演算子バージョンは で||、同じように機能します。

于 2013-03-06T20:29:44.750 に答える
2

あなたも違うと思うことができます...

if ! [[ $X == dogs || $X == birds || $X == cats ]]; then
    echo "'$X' is not dogs or birds or cats... It could be monkeys."
fi

考えているように:

それは犬でも猫でも鳥でもありません

考えることとまったく同じではありません

犬でも猫でも鳥でもありません。

これにより、のアプローチがcaseより明確になります。うまくいけば、この場合、これを行う正しい方法は次のとおりです。

case $X in
    dogs )
        # There may be some part of code
        ;;
    birds )
        # There may be some other part
        ;;
    cats )
        # There is no need to be something at all...
       ;;          
    * )
       echo "'$X' is not dogs or birds or cats... It could be monkeys."
       ;;
esac

または、鳥、猫、犬の場合を処理する必要が本当にない場合:

case $X in
    dogs|birds|cats ) ;;
    * )
       echo "'$X' is not dogs or birds or cats... It could be monkeys."
       ;;
esac
于 2013-03-06T21:24:31.760 に答える
1

$X を複数回配置する必要を回避するために Bash で考えることができる唯一の方法は、RegEx を使用することです。

if [[ ! "$X" =~ (dogs|birds|cats) ]]; then
    echo "it's is a monkey"
fi

同様に、簡単に言えば:

[[ ! "$X" =~ (dogs|birds|cats) ]] && echo "it's is a monkey"

これは、変数が非常に長い場合や、比較が非常に短い場合に役立ちます。

特殊文字をエスケープすることを忘れないでください。

于 2013-07-10T21:55:57.370 に答える
0
X=$1;
if [ "$X" != "dogs" -a "$X" != "birds" -a "$X" != "dogs" ]
then
    echo "it's is a monkey"
fi

あなたがすでに持っていたものに最も近い

于 2013-03-06T21:08:40.773 に答える