複数の添え字を含む基本スクリプトがあります。デフォルトスクリプトを実行すると、すべてのサブスクリプトが順次実行され始めます。一部のスクリプトは通過し、一部は失敗する可能性があります。この基本スクリプトを2番目に実行するときは、成功した添え字の代わりに失敗した添え字だけを実行したいと思います。どんな助けでも大変感謝します。
2番目の質問は、「r」はすべてのスクリプトに共通ですが、「d」はオプションという主張があるということです。例: mainscript.sh -r India -d 2021-05-21 しかし、最初の添え字にはdパラメータがないため、実行するたびに失敗します。この無効な引数を無視してスクリプトを実行するにはどうすればよいですか?
#!/bin/bash
recall() {
script1.sh $* ;
script2.sh $* ;
script3.sh $* ;
script4.sh $* ;
script5.sh $*
exit
}
recall $*
答え1
スクリプト(またはすべてのプログラム)が一度だけ実行されるようにする一般的な方法は、状態を維持するフラグをどこかに作成することです。
この例では、ユーザーのホームディレクトリにファイルがあるかどうかをフラグとして使用します。ファイルが存在する場合、アプリケーションは正常に実行されたため、再実行しないでください。
#!/bin/bash
flag="$HOME/.my_script.flg"
{[ ! -f "$flag" ]] && my_script && touch "$flag"
ここではファイルが存在するかどうかをテストします$flag
。存在しない場合は外部スクリプトを実行しmy_script
、成功/ 0状態で終了すると$flag
ファイルを生成します。競争条件があります。この制御スクリプトの 2 つのインスタンスを同時に実行すると、2 番目のスクリプトがすでに同じサブスクリプトの実行を開始するまで、最初のスクリプトがフラグファイルを生成できないことがあります。私は行くこの質問を無視してください前提は、ユーザーが自分が何をしているのかを知る必要があるということです。そうでない場合は、スクリプトの単一インスタンスのみを同時に実行する必要があります。
これは特定の状況に応じて拡張できます。
#!/bin/bash
recall() {
local script flag
for script in script{1,2,3,4,5}.sh
do
flag="$HOME/.${script%.sh}.flg"
[[ ! -f "$flag" ]] && "$script" "$@" && touch "$flag"
done
exit 0
}
recall "$@"
ここで$script
、変数は、実行される添え字または関数の名前を繰り返すために使用されます。それぞれが0
正常に返されたと仮定し、それ以外の場合はゼロ以外の戻り値を返します。
成功時に完全終了ステータスを成功、失敗時にゼロ以外に設定するには、0
スクリプトを少し拡張する必要があります。実行されたモジュールの数に関係なく、失敗したモジュールの数を返します。
#!/bin/bash
recall() {
local script flag error=0
for script in script{1,2,3,4,5}.sh
do
flag="$HOME/.${script%.sh}.flg"
if [[ ! -f "$flag" ]]
then
if "$script" "$@"
then
touch "$flag"
else
((error++))
fi
fi
done
return $error
}
recall "$@"
言うまでもなく、添え字が再度実行されるようにファイルを表示する適切なフラグを削除します。