この答えで解決できる問題があります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
。これにより、この時点でスクリプトが中止され、呼び出し元にエラーがあったことが通知されます。