ifステートメントをifステートメントに変換

ifステートメントをifステートメントに変換

現在、パフォーマンスを向上させるためにスクリプトの変更をテストしています。特に声明ifに変更したいと思いますcase

ただし、シェルプログラミングが初めてなので、次のような宣言が必要です。

if [ "$A" == "x" -a "$B" == "y" ] 
    then
        let a=a+1
fi 

私は成功せずにこれを試しました。

case "$A$B" in
    "x""y") let a=a+1
;;
esac

私は何が間違っていましたか?

Caseステートメントで「!=」を管理できますか?たとえば、

if [ "$A" == "x" -a "$B" != "y" ] 
then
    let a=a+1
fi 

ベストアンサー1

あなたのcase例は私にとって効果的でしたが、比較していることに注意してください。従属andAなので、isとareが空の場合、パターンBも一致します。 (中二重引用符は重複していると思います。)AxyBcase言葉パターンと比較するため、接続を除いて複数の変数を比較することはできません。

標準testまたは[コマンドでは、比較演算子はです===一部のシステムでは動作しますが、すべてではありません。さらに、-a少なくとも次のような条件では、-n結合された条件を使用することが問題になります。 (望むよりこの問題)。を使用する方が良いですif [ "$A" = x ] && [ "$B" = y ] ; then ...

aを反転する場合は、caseターゲット文字列を除くすべての項目に一致するパターンを作成する必要があります。extglob大きな打撃を受けた状態でOther は、以下を除くすべての一致を許可します。

case $B in !(y) ) echo not y ;; esac

これがない場合は、パターンを反転するためにさらに作業を行うか、複数のパターンを使用する必要があります。まず、文字列と一致し、後でデフォルトの一致が実際の操作を実行します。

case $B in ??*) echo not y ;; [^y]) echo also not y ;; esac

case $B in y) ;; *) echo still not y ;; esac

(特に最初の保証はありません。正直なところ、これを行うという考えはひどいようです。)

とにかくパフォーマンス上の理由に言及したので、単純な比較のためではなく、外部プログラム(例えば、などgrepsedcutjq

おすすめ記事