我编写了一个.sh文件来编译并运行一些程序来完成作业。我在脚本中有一个“for”循环,但除非我只使用整数,否则它将不起作用:
#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
./hw3_2_2 $i
done
变量$ i是程序hw3_2_2的输入,我有我想要使用的非整数值。我怎么能循环运行带有十进制数列表的代码?
答案 0 :(得分:38)
我发现令人惊讶的是,在五年内没有人提到过为生成范围而创建的实用程序,但是,它再次来自于2005年左右的BSD,也许它在Linux上通常都没有。提出了问题。
但这是:
for i in $(seq 0 0.1 1)
或者,要打印所有宽度相同的数字(通过添加或附加零),请使用-w
。这有助于防止数字作为“整数”发送,如果这会导致问题。
语法为seq [first [incr]] last
,first
默认为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。