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

时间:2015-02-25 07:03:36

标签: bash shell unix

#!/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计数器。这是否存在?

3 个答案:

答案 0 :(得分:5)

您的作业声明之间有空格,如下所示:

count = `expr $count - 1`
     ^  ^

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

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)

答案 1 :(得分:3)

以下是对您的剧本进行坚如磐石的重写,以向您展示它通常如何完成:

#!/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扩展为一个或多个数字的字符串时才为真,那么我&# 39;确保Bash在基数10中处理count:在算术上下文中,10#$count将计数基数为10.如果没有这个,则输入0809会使一些后续部分失败,因为对于Bash,前导零意味着该数字应该在基数8中解释,因此08无效!
  • 最后一个循环是用Bash的算术上下文((...))编写的。您不需要外部expr来执行简单算术。

答案 2 :(得分:0)

您也可以使用bash算术扩展:

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

我还建议第一个测试-le not -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