freeBSDで2つのスクリプトを実行するforループを作成しようとしています。 shとcshのどちらで書かれているかは関係ありません。私は次のようなものが欲しいです:
for($i=11; $i<=24; $i++)
{
exec(tar xzf 'myfile-1.0.' . $i);
// detect an error was returned by the script
if ('./patch.sh')
{
echo "Patching to $i failed\n";
}
}
誰かがこれを行う方法を知っていますか?
ありがとう
cshは正常にループしますが、問題はexecを使用していることです。これにより、現在のプログラム(シェル)が別のプログラムに置き換えられます同じプロセス内。他の人がshバージョンを提供しているので、ここにcshバージョンがあります。
#!/ bin/csh set i = 11 while($ i <25) tar xzf "myfile-1.0。$ i" #スクリプトによってエラーが返されたことを検出 if({./ patch.sh})then echo "Patching to $ i failed" endif @ i = $ i + 1 end
./patch.sh
についてよくわかりませんか?その存在をテストしていますか、それとも実行していますか?ここで実行し、結果をテストしています-trueは、ゼロを返したことを意味します。または:
#スクリプトによってエラーが返されたことを検出 if(!{tar xzf "myfile-1.0。$ i"})then echo "Patching to $ i failed" endif
Shでこれを行う一般的な方法は次のとおりです。
for i in $(seq 11 24); do
tar xzf "myfile-1.0$i" || exit 1
done
seq
は標準ではないことに注意してください。ツールの可用性に応じて、次のことを試してみてください。
jot 14 11 24
または
Perl -E 'say for(11..24)'
または
yes '' | nl -ba | sed -n -e 11,24p -e 24q
いくつかの変更を加えました。tarがスクリプトではなくエラーメッセージを出力する必要があるため、tarが失敗し、エラーメッセージを出力しない場合は中止します。
うわー! BASHはありません。そしておそらくKornshellはありません:
i=11
while [ $i -le 24 ]
do
tar xzf myfile-1.0.$i
i=`expr $i + 1`
if ./patch.sh
then
echo "patching to $i failed"
fi
done
神が意図したように、純粋なボーンシェルで書かれています。
$i
に1を追加するには、expr
コマンドを使用する必要があることに注意してください。 BourneShellは数学を行いません。バッククォートは、コマンドを実行し、コマンドのSTDOUTを$i
に入れることを意味します。
KornshellとBASHは、数学を実行し、より複雑なforループを実行できるため、これをはるかに簡単にします。