現在、パフォーマンスを向上させるためにスクリプトの変更をテストしています。特に声明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
も一致します。 (中二重引用符は重複していると思います。)A
xy
B
case
言葉パターンと比較するため、接続を除いて複数の変数を比較することはできません。
標準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
(特に最初の保証はありません。正直なところ、これを行うという考えはひどいようです。)
とにかくパフォーマンス上の理由に言及したので、単純な比較のためではなく、外部プログラム(例えば、などgrep
、sed
cut
jq