17

我编写了一个 .sh 文件来编译和运行一些用于家庭作业的程序。我在脚本中有一个“for”循环,但除非我只使用整数,否则它不会工作:

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

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

4

6 回答 6

47

令我惊讶的是,五年来没有人提到为生成范围而创建的实用程序,但是,再一次,它来自 2005 年左右的 BSD,也许在提出问题时它甚至还没有在 Linux 上普遍可用.

但这里是:

for i in $(seq 0 0.1 1)

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

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

于 2015-08-19T18:18:16.627 回答
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

$(< my-numbers.txt) 部分是(在 Bash 中)替换脚本该位置的名称文件内容的有效方法。感谢 Dennis Williamson 指出没有必要为此使用外部cat命令。

于 2010-03-18T17:53:30.980 回答
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) } }'
于 2010-03-19T00:41:21.573 回答
2

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

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
于 2010-03-18T18:07:02.803 回答
1

我通常也根据第二个答案使用“seq”,但只是根据精度稳健的整数循环给出答案,然后将 bc 转换为浮点数:

#!/bin/bash 

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

给出:

.2 .4 .6 .8 1.0

于 2017-05-05T12:02:46.273 回答
0

bash 不做十进制数。要么使用类似的东西bc,要么转向更完整的编程语言。不过要注意准确性问题

于 2010-03-18T17:54:15.657 回答