当我尝试在bash中的for循环中使用if时出错

时间:2014-01-31 08:40:43

标签: bash if-statement for-loop

当我尝试在for循环中运行for循环时,我遇到了问题。

我尝试用步骤10的ips制作24个文件。

要在第一个文件中解释更多,我需要让所有的ips在1-10和第二个11到20之间结束,依此类推。

我尝试使用:

    for i in {1..240}
    do
    for r in {1..24}
    do
        if [ "$i" -le "$r0" ]
        then
            echo "4.2.2.$i" >> "server-$r"
        fi
    done
done

我收到的错误是当我运行bash -xv script_name:

script_name: line 5: [: : integer expression expected
+ for r in '{1..24}'
+ '[' 240 -le '' ']'
script_name: line 5: [: : integer expression expected
+ for r in '{1..24}'
+ '[' 240 -le '' ']'
script_name: line 5: [: : integer expression expected

文件名是server- $ r,即server-1,server-2,依此类推,直到server-24

有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

错误如下:

if [ "$i" -le "$r0" ]

您没有变量r0,这会导致错误。说:

if [ "$i" -le "${r}0" ]

反而是为了避免含糊不清。


由于你希望乘以数字10,你可以用数学方式把它写成:

if [ "$i" -le $((r*10)) ]

甚至

(( i <= r*10 ))

答案 1 :(得分:1)

这不是以任何方式做事的bash-native / idiomatic方式。

for ((i=1; i<=240; i++)); do
    for ((r=1; r<=24; r++)); do
        if (( i <= (r * 10) )); then
            echo "4.2.2.$i"
        fi
    done >"server-$r"
done

每个server-$r值只打开一次$r文件比为每个echo打开它更有效(否则每次需要时都打开和关闭文件)要被访问),并且使用诸如{1..3}之类的扩展是不灵活的(仅支持文字数字,而不是变量)并扩展到迭代的词表,因此使用比使用C风格的循环更多的内存。