#!/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计数器。这是否存在?
答案 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.如果没有这个,则输入08
或09
会使一些后续部分失败,因为对于Bash,前导零意味着该数字应该在基数8中解释,因此08
无效!((...))
编写的。您不需要外部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