このシェル スクリプトに終了コードを含むブール式を含める目的は何ですか?

このシェル スクリプトに終了コードを含むブール式を含める目的は何ですか?

この答えで解決できる問題がありますhttps://superuser.com/a/508761

今は、他のことをするためにこれを拡張する必要がありますが、まずは変更する前に、それがどのように動作するかをよりよく理解する必要があります。問題のスクリプトは次のとおりです。

#!/bin/bash

(( $# != 2 )) && exit 1

for f in *; do
  newf="${f//$1/$2}"
  if [[ $f != $newf ]]; then
    mv "$f" "$newf"
  fi
done

何を(( $# != 2 )) && exit 1するのでしょうか? オンラインで説明を見つけるのにあまり運がありませんでした。各コンポーネントが何であるかはわかりましたが、スクリプト全体で行全体が何をするかはわかりませんでした。回答ではその行について説明されていませんでした。投稿者が最後にオンラインになったのは 2 年以上前で、5 年前の質問を蒸し返したくなかったので、ここに投稿しました。

答え1

制御演算子です

から強打する男:

制御演算子 && と || は、それぞれ AND リストと OR リストを表します。
 ANDリストの形式は
command1 && command2です。
command2 は、command1 が終了ステータス 0 を返した場合にのみ実行されます。 [..カット..] ANDおよびORリストの戻りステータスは、最後のコマンドの終了ステータスです。 リスト内で実行されます。
制御演算子
    制御機能を実行するトークン。次のいずれかのシンボルです。
        || & && ; ;; ()|
 

(クレジット)

したがって、この場合はブール演算子として読み取らないでください&&。これで、がいつ実行されるかがわかりますexit 1。前のコマンドが成功した場合のみ (終了ステータスが 0 の場合) です。

これを見てサーバー障害の回答のために&&Bash の 3 つの異なるコンテキストでの説明。それらの違いを学ぶのに役立ちます。

答え2

スクリプトに渡された引数が正確に 2 つでなかった場合、その行でスクリプトが終了します。

  • $#スクリプトを呼び出すときに渡される引数の数です。Cargc言語の場合と同様です。

  • (( $# != 2 ))0引数の数が等しくない場合はtrueyコード( )を返します。2

  • &&左側が truey コードで終了した場合にのみ右側を実行します。つまり、引数の数が 2 でない場合、右側が実行されます。

  • exit 1は、 falsey 終了コードでスクリプトを終了します1。これにより、この時点でスクリプトが中止され、呼び出し元にエラーがあったことが通知されます。

関連情報