我如何编辑此代码以供用户输入并以 0 结束?

我如何编辑此代码以供用户输入并以 0 结束?
#!/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。例如:

  1. read接受提示字符串,无需单独的printf

    read -p 'Type in a whole number!: ' x
    
  2. 您可以使用算术表达式代替(( x > 0 ))测试[ x -gt 0 ]括号,并使用后缀减量((x--))

  3. 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

相关内容