宿題のためにいくつかのプログラムをコンパイルして実行するために、.sh ファイルを作成しました。スクリプトに「for」ループがありますが、整数のみを使用しないと機能しません。
#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
./hw3_2_2 $i
done
変数 $i はプログラム hw3_2_2 の入力であり、使用したい整数以外の値があります。10 進数のリストを使用してコードを実行するには、どうすればループできますか?
範囲を生成するためだけに作成されたユーティリティについて 5 年間誰も言及しなかったことは驚くべきことですが、2005 年頃に BSD に由来するものであり、おそらく質問が行われた時点では Linux で一般的に利用可能でさえありませんでした。 .
しかし、ここにあります:
for i in $(seq 0 0.1 1)
または、すべての数値を同じ幅で (先頭または末尾にゼロを追加して) 印刷するには、 を使用します-w
。これにより、問題が発生する場合に、数値が「整数」として送信されるのを防ぐことができます。
構文はseq [first [incr]] last
で、既定値はfirst
1で、既定値は より大きいか小さいincr
かに応じて 1 または -1 になります。その他のパラメータについては、seq(1)を参照してください。last
first
最も簡単な方法は、それらをリストすることです。
for a in 1.2 3.4 3.11 402.12 4.2 2342.40
do
./hw3_2_2 $a
done
リストが巨大でリテラルリストとして持つことができない場合は、ファイルにダンプしてから次のようなものを使用することを検討してください
for a in $(< my-numbers.txt)
do
./hw3_2_2 $a
done
$(< my-numbers.txt) 部分は、(Bash で) スクリプトのその場所にある名前ファイルの内容を置き換える効率的な方法です。cat
これには外部コマンドを使用する必要がないことを指摘してくれた Dennis Williamson に感謝します。
awk を使用して小数を生成できます。0.1
num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}')
for n in $num
do
./hw3_2_2 $n
done
または、完全にawkで実行できます
awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }'
ここに別の方法があります。ヒア ドキュメントを使用して、スクリプトにデータを含めることができます。
read -r -d '' data <<EOF
1.1
2.12
3.14159
4
5.05
EOF
for i in "$data"
do
./hw3_2_2 "$i"
done
同様に:
array=(
1.1
2.12
3.14159
4
5.05
)
for i in "${array[@]}"
do
./hw3_2_2 "$i"
done
bash は 10 進数を処理しません。そのようなものを使用するかbc
、より完全なプログラミング言語に移行してください。ただし、精度の問題に注意してください。