#!/bin/bash
printf "Type in a whole number!: " && read X
x=1
while [ $x -le 5 ]
do
echo x
x=$(( $x - 1 ))
done
我希望此脚本让用户输入一个数字,然后从该数字“x”开始倒计时并停止在 0。我不知道为什么它会无限地继续下去并且不会停止在 0。
答案1
由于您正在使用bash
,因此您可以使用 POSIX 中可能不可用的某些功能/bin/sh
。例如:
read
接受提示字符串,无需单独的printf
read -p 'Type in a whole number!: ' x
您可以使用算术表达式代替
(( x > 0 ))
测试[ x -gt 0 ]
括号,并使用后缀减量((x--))
bash 有一个
until
可能更适合倒计时的结构
例如:
#!/bin/bash
read -p 'Type in a whole number!: ' x
until (( x == -1 )); do
printf '%d\n' $((x--))
done
前任。
$ ./myscript
Type in a whole number!: 5
5
4
3
2
1
0
答案2
如果我理解正确的话,你的代码的x=$(( $x - 1 ))
意思是“将 1 减去x
”,那么就会发生这种情况:
x=1
loop 1
x=$(( 1 - 1 )) # = 0
loop 2
x=$(( 0 - 1 )) # = -1
等等
x
因此小于或等于五的条件永远成立。所以你的意思是添加1 至x
,不是减去。
另一件事是,你echo
回应的是字符串x
,而不是值x
,所以应该是
echo $x
您将看到这种方式的结果x
(添加sleep 1
):
Type in a whole number!: # typed 1
1
0
-1
-2
...
另一件事是,您X
在中设置了变量(大写)read
,但随后您想使用(我假设)该变量,因此您的代码应该是:
printf "Type in a whole number!: " && read X
#x=1
while [ $X -le 5 ]
do
echo $X
X=$(( $X + 1 ))
done
因此,执行脚本:
Type in a whole number!: # typed 1
1
2
3
4
5
答案3
您还可以使用 C 样式的for
循环。在 bash 中,如下所示:
read -p "Enter a number: " x
for (( ; x >= 0; x-- )); do
echo $x
done
或者你可以使用seq
:
seq "$x" -1 0