prog
端末から呼び出すときに、次の整数引数を受け入れるプログラムがあります。
./prog 10
prog
次の値の範囲を使用してこれを実行したいと思います10, 20, 30, ...
。以下を使用する代わりに、きちんとした方法があります。
./prog 10 ; ./prog 20 ; ./prog 30 ; ....
答え1
Bash、Zsh、またはKsh93で単純なforループを使用できます。以下は、Bashバージョン4(2009)、zsh 4.3.10(2010)、およびksh93r(2006)にのみ適用されます(構文は(1995){x..y}
で始まりましたが)。zsh
2.6-beta4
#!/bin/bash
# since Bash v4
for i in {10..100..10}
do
$path_of_prog/prog $i
done
この{$start..$end..$step}
部分は$i
開始が等しいことを意味し、に移動します$start
。各段階で追加される金額です。このようにして、我々はの値を得る。$i
$end
$step
$i
10 20 30 ... 100
$i
1行にすべて書くこともできます
for i in {10..100..10}; do ./prog $i; done
以前の Bash があり、seq
GNU を使用できる場合は、次の行を使用します。
#!/bin/bash
#only for pre Bash v4
for i in $(seq 10 10 100)
do
$path_of_prog/prog $i
done
または単一の裏地で
for i in $(seq 10 10 100);do ./prog $i; done
$IFS
(上記では変数を変更していないとします。)
答え2
質問は次のように表示されますbash
。これは他のシェルユーザー用です。
POSIX shスクリプト(移植性のため):
i=10
while [ "$i" -le 100 ]; do
./prog "$i"
i=$(($i+10))
done
Bourne shスクリプト(90年代以前のシステムとの互換性のため):
echo '0[10+pd100>x]dsxx' | dc | xargs -n 1 ./prog
zsh
(使用が制限されていない場合)bash
:
i=0; repeat 10 ./prog $((i+=10))
または
for i ({1..10}0) ./prog $i
または:
for ((i=10;i<=100;i+=10)) ./prog $i
または:
zargs -n1 {1..10}0 -- ./prog
答え3
printfにこれを行う方法はいくつかありますが、以下はいくつかの例です。
printf ' ./prog %d0\n' 1 2 3 | sh
あるいは、プログラムが実際に30回実行されることを望むかもしれません。seq
影響そしてprintf
この目的に最適です。
printf ' ./prog %d\n' `seq 1 30` | sh
あるいは、コマンドの結果に、パイプの最後で犠牲にしたくないいくつかの変数値が含まれている可能性があります。いいね:
. <<CMD /dev/fd/0
$(printf './prog %d0\n' 1 2 3 )
CMD
数字は必要ありませんが、文字列の複数のコピーが必要な場合があり、コマンドの一部のみを繰り返す必要がありますが、他の部分は静的である可能性があります。
. <<CMD /dev/fd/0
$( { printf 'echo "this is part 1" >&2| ' ;\
printf 'echo "these are parts %d" >&2 | ' `seq 1 5` ; })
CMD
printf 'this string is repeated for each of printfs args,
but the args are not included%.0b\n' `seq 1 5`