編集:再試行しましたが、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
は常に実行されます。どうすればこれを修正できますか?
サブシェルを使用してグループ化できます。
if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
...
else
...
fi
それはうまくいきます:
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
問題のコードは実際のシェルでは正常に機能するはずですが、他のプログラムでは解析できない可能性があることは理解できます。そのプログラムを修正できないと仮定すると、回避策は、条件の2番目の部分を関数に分割することです。
cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
...
これはそれほど簡単ではありませんが、パーサーがanythingの価値がある場合は、その関数定義を解析できるはずです。