【问题标题】:Error when i try to use if in the for loop in bash当我尝试在 bash 的 for 循环中使用 if 时出错
【发布时间】:2014-02-23 21:13:03
【问题描述】:

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

我尝试使用 ips 制作 24 个文件,步长为 10。

为了在第一个文件中解释更多,我需要所有 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

有什么建议吗?

谢谢。

【问题讨论】:

    标签: bash if-statement for-loop


    【解决方案1】:

    错误如下:

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

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

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

    而是为了避免歧义。


    由于您想将数字乘以 10,因此您可以在数学上将其写为:

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

    甚至

    (( i <= r*10 ))
    

    【讨论】:

    • $((...))((...)) 内部是多余的:(( i &lt;= r*10 ))
    • 它正在工作,但在文件中我发现 progresiv 所有 ips,而不仅仅是那 10 个 ips。第一个是 1 到 10,第二个是 1 到 20,最后一个是 1 到 240。我怎样才能限制 10 个 ips。
    【解决方案2】:

    无论如何,这不是 bash 原生/惯用的做事方式。

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2016-09-04
      相关资源
      最近更新 更多