Shell循环使用非整数?

时间:2010-03-18 17:52:05

标签: bash scripting loops sh

我编写了一个.sh文件来编译并运行一些程序来完成作业。我在脚本中有一个“for”循环,但除非我只使用整数,否则它将不起作用:

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

变量$ i是程序hw3_2_2的输入,我有我想要使用的非整数值。我怎么能循环运行带有十进制数列表的代码?

6 个答案:

答案 0 :(得分:38)

我发现令人惊讶的是,在五年内没有人提到过为生成范围而创建的实用程序,但是,它再次来自于2005年左右的BSD,也许它在Linux上通常都没有。提出了问题。

但这是:

for i in $(seq 0 0.1 1)

或者,要打印所有宽度相同的数字(通过添加或附加零),请使用-w。这有助于防止数字作为“整数”发送,如果这会导致问题。

语法为seq [first [incr]] lastfirst默认为1,incr默认为1或-1,具体取决于last是否大于或小于first。有关其他参数,请参阅seq(1)

答案 1 :(得分:9)

最简单的方法就是列出它们:

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

$(&lt; my-numbers.txt)部分是一种有效的方式(在Bash中),用于替换脚本位置中的names文件的内容。感谢Dennis Williamson指出不需要使用外部cat命令。

答案 2 :(得分:9)

您可以使用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) } }'

答案 3 :(得分:2)

这是另一种方式。您可以使用此处的doc将您的数据包含在脚本中:

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

答案 4 :(得分:1)

我通常也会使用&#34; seq&#34;根据第二个答案,但只是给出一个精确鲁棒的整数循环的答案,然后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

答案 5 :(得分:0)

bash不做十进制数。要么使用bc之类的东西,要么使用更完整的编程语言。但请注意accuracy problems