为什么这个 bash 程序会进入死循环?

Why is this bash program going into an infinite loop?

#!/bin/bash

echo "Enter number of loops"
read count
echo $count
if [ $count -eq 0 ]
 then
    echo "The count cannot be zero. Enter a number again"
    read count
fi

while [ $count -gt 0 ]
do
    echo "Loop numner $count"
    count = `expr $count - 1`
done

我正在尝试在 bash 中模拟一个 Java 计数器。这个存在吗?

您的赋值语句之间有 space,如下所示:

count = `expr $count - 1`
     ^  ^

删除“=”之间的 space,如下所示:

count=`expr $count - 1`
Output
Enter number of loops
10
10
Loop numner 10
Loop numner 9
Loop numner 8
Loop numner 7
Loop numner 6
Loop numner 5
Loop numner 4
Loop numner 3
Loop numner 2
Loop numner 1

另外请注意,不鼓励使用反引号,您应该使用类似的东西:

 count=$(expr $count - 1)

也可以使用bash算术展开:

    count="$((count -1))"

我还建议将第一个测试设为 -le 而不是 -eq,以防用户键入负整数,并在用户根本不键入任何内容时引用它。

    if [ "$count" -le 0 ]

因此您的代码将是:

    #!/bin/bash

    echo "Enter number of loops"
    read count
    echo $count
    if [ "$count" -le 0 ]
     then
        echo "The count cannot be zero. Enter a number again"
        read count
    fi

    while [ $count -gt 0 ]
    do
        echo "Loop numner $count"
        count="$((count - 1))"
    done

这是对脚本的可靠重写,向您展示它通常是如何完成的:

#!/bin/bash

while true; do
    read -rep "Enter number of loops: " count
    if [[ $count = +([[:digit:]]) ]]; then
        ((count=10#$count))
        ((count>0)) && break
        printf 'The count cannot be zero. Enter a number again.\n'
     else
        printf 'Please enter a valid number.\n'
     fi
done

while ((count>0)); do
    printf 'Loop number %s\n' "$count"
    ((--count))
done
  • 使用 read-r 标志使反斜杠不转义某些字符(这应该是默认设置),使用 -e 选项以便 read 使用readline: 对用户来说更舒服,用-p选项指定提示。
  • 我完全重新审视了您用来读取用户输入的逻辑:read 是一个无限循环中的 运行,只有在用户输入有效数字时才能中断。使用您的方法,用户可以输入两次无效数据,并且循环将具有 运行 和随机参数。不好。
  • 为了检查用户输入是否有效,我正在使用模式匹配:[[ $count = +([[:digit:]]) ]] 当且仅当 count 扩展为一个或多个数字的字符串时才为真,那么我' m 确保 Bash 将处理基数 10 中的 count:在算术上下文中,10#$count 处理基数 10 中的计数。没有这个,像 08 或 [=22 这样的输入=] 会使后续部分失败,因为前导零表示 Bash,该数字应以基数 8 解释,因此 08 无效!
  • 最后一个循环是用 Bash 的算术上下文 ((...)) 编写的。您不需要外部 expr 来执行简单的算术运算。