端末コマンドテンプレートループで&&演算子を使用できますか?

端末コマンドテンプレートループで&&演算子を使用できますか?

より読みやすく、同様のコマンドのリストをより明確にしたいので、少しのターミナルループを作成しました。

for what in \
   cache \
   thumbs \
; do my template $what:clear; done

うまくいきますが、

my template cache:clear && my template thumbs:clear

簡単で明確に配置する方法はありませんか?&&このようなループで作業すると最後のコマンド終了コードを確認するために、ループ本体にif / elseステートメントを追加し、ゼロ以外の場合にブレークを呼び出すのは複雑ではありませんか?

条件が十分であれば:

for what in \
   cache \
   thumbs \
; do
my template $what:clear;
if [ $? -ne 0 ]; then break; fi \
; done

ベストアンサー1

あなたが使用できるset -e

(set -e;
for what in \
   cache \
   thumbs;
do my template $what:clear; done)

set -eコマンドがゼロ以外の終了コードで終了したときにシェルを終了させ、失敗は他に処理されません。上記でmy ...失敗すると、サブシェル全体が終了し、サブシェルの終了コードは失敗したコマンドの終了コードです。これはシェルスクリプトとコマンドラインで機能します。

別の方法は分離を使用することです。

for what in \
   cache \
   thumbs; do
    my template $what:clear || break
done

欠点は、|| breakすべてのコマンドの後に必要であり、失敗を示す終了コードを無視することです。ループはfor毎回ゼロの終了コードで終了します。終了コード1を使用してループを終了させるフェイルオーバーを設定することで、breakこれを回避できます(これは上記のサブシェルアプローチよりも劣っています)。for

for what in \
   cache \
   thumbs; do
    my template $what:clear || break -1 2>/dev/null
done

(ゼロ以外の終了コードで終了し、対応するbreak -1エラーメッセージを削除します。)break2>/dev/null

私が知っている限り、&&終了ループのような&& doneものは使用できません。

おすすめ記事