为什么这个 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
来执行简单的算术运算。
#!/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
来执行简单的算术运算。