web-dev-qa-db-ja.com

csh / sh forループ-方法は?

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";
   }
}

誰かがこれを行う方法を知っていますか?

ありがとう

7
Paul J

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 
3
cdarke

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が失敗し、エラーメッセージを出力しない場合は中止します。

6
William Pursell

うわー! 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ループを実行できるため、これをはるかに簡単にします。

5
David W.