質問

私は宿題のためのいくつかのプログラムをコンパイルして実行する.SHファイルを書きました。私は、スクリプト内のループ「のために」が、私は整数のみを使用しない限り、それは動作しませんしています:

#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
    ./hw3_2_2 $i
done

変数$ iは、プログラムhw3_2_2ための入力である、と私は私が使用したい非整数値を持っています。どのようにできたI進数のリストでコードを実行するループスルー?

役に立ちましたか?

解決

私は5年間で、誰もちょうど範囲を生成するために作成したユーティリティを言及していないこと、それは驚くべき発見、しかし、その後、再び、それは2005年の周りにBSDから来て、そしておそらくそれは時にLinux上でも、一般的に利用できませんでした質問が行われました。

しかし、ここでは、それは、次のとおりです。

for i in $(seq 0 0.1 1)

または、(前置またはゼロを追加することによって)同じ幅を持つすべての番号を印刷するために、-wを使用します。それはそれが問題を引き起こす場合は、「整数」として送信されている数字を防ぐことができます。

構文がseq [first [incr]] lastを1にデフォルト設定、及びfirstincrlastより大きいか小さいかに応じて、1または-1のいずれかをデフォルトで、firstあります。他のパラメータについては、配列(1)をご覧ください。

他のヒント

あなたは小数を生成するためにawkのを使用することができます例えば手順はof0.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) } }'

最も簡単な方法は、ちょうどそれらをリストすることです。

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

$(<私の-numbers.txt)部分は、スクリプトのその場所に名前のファイルの内容を置換する効率的な方法(バッシュ)です。このため、外部catコマンドを使用する必要がないことを指摘してデニスウィリアムソンに感謝します。

ここでは別の方法です。あなたは、スクリプト内のデータを含めるためにここにドキュメントを使用することができます:

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

Iは、通常、第二の答えに従って「SEQ」を使用し、ちょうど精密ロバスト整数ループの観点から回答を得、次いで、floatに変換BC

#!/bin/bash 

for i in {2..10..2} ; do 
  x=`echo "scale=2 ; ${i}/10" | bc`
  echo $x
done

与えます:

0.2 0.4 0.6 0.8 1.0

bashは小数を行いません。どちらか、またはより完全なプログラミング言語に移動することができますbcようなものを使用。 精度の問題に注意してくださいしかしします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top