web-dev-qa-db-ja.com

混合する場合..; {コマンドグループ化}と[[テスト]]および論理演算子を使用

編集:再試行しましたが、bashで正常に動作します。何が変わったのかわかりません。私のエディター(Bashを使用したVS Code IDE拡張子)はまだfailed to parseエラーですが、スクリプトは正しく実行されます。質問を削除する必要がありますか?

元の質問

私のスクリプトは現在これを行っています:

if cmd1; then
  echo Success
else
  if [[ "$x" == "z" ]] && cmd2; then
    echo Success
  else
    echo Failure
  fi
fi

私はそれを「ワンライナー」に短縮しようとしていますが、bashは次のようなステートメントで窒息します:

if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
   echo Success
else
   echo Failure
fi

私は思います { grouping }が必要なのは、そうでなければ&& cmdは常に実行されます。どうすればこれを修正できますか?

4

サブシェルを使用してグループ化できます。

if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
  ...
else
  ...
fi
4
jesse_b

それはうまくいきます:

cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
   echo Success
else
   echo Failure
fi
Success

このコードをshで実行していませんか?それはあなたに次のようなものを与えるでしょう

sh: 4: [[: not found
4
glenn jackman

問題のコードは実際のシェルでは正常に機能するはずですが、他のプログラムでは解析できない可能性があることは理解できます。そのプログラムを修正できないと仮定すると、回避策は、条件の2番目の部分を関数に分割することです。

cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
     ...

これはそれほど簡単ではありませんが、パーサーがanythingの価値がある場合は、その関数定義を解析できるはずです。

0
ilkkachu