while 循环 |反向计数 n..8 7 6 5 4 3 2 1.

  • 本文关键字:循环 while bash while-loop
  • 更新时间 :
  • 英文 :


我正在尝试通过用户输入进行自动反向计数。错误是我不断两次获得序列中的第一个数字。

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
echo "Input number"
read k
while test $k != 0
do
    echo "$k"
    k="$(( k - 1 ))"
done

输出:

[root@localhost standalone_scripts]# . ./decr.sh
Input number
5
5
4
3
2
1

正如注释中指出的那样,它显示的是用户输入。 如果您不喜欢它的显示方式,那么您可以使用回声切换减法的顺序。

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
echo "Input number"
read k
while test $k != 0
do
      k="$(( k - 1 ))"
      echo "$k"
done

以下是脚本的习惯性 Bash 重新表述:

  • 使用 read -p 在同一行上打印提示字符串和用户的输入,这使得将用户的输入误解为脚本输出的一部分的可能性降低(这就是提示 OP 问题的原因)。

    • 这可能比使用 read -s 更可取,后者禁止在键入用户输入时回显输入。
  • 使用Bash原生的C式算术for循环(for (( ...; ...; ... )))避免了对非标准外部seq实用程序的可移植性的担忧。

    • 对于较小的输入数字,这可能也比使用 seq 更快,并且还使您可以灵活地单独对每个数字进行操作。
    • 对于较大的输入数字,seq会更快。
#!/usr/bin/env bash
read -p "Input number: " k
for (( i = k; i >= 1; --i )); do
  echo "$i"
done

在请求用户输入后,您可以避免换行符(并可能添加一个:),以便清楚地知道第一个5是用户输入。

然后这里有一个使用 seq 而不是 while 的例子,尽管根据@andlrc的说法,seq的可移植性较差。

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
printf "Input number: "
read k
seq $k -1 1

输出:

$ ./decr.sh 
Input number: 5
5
4
3
2
1

编辑:

@mklement0的答案是最好的。

read -p "Input number: " k

read -s将关闭readecho效果

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
echo "Input number"
read -s k
while test $k != 0
do
    echo "$k"
    k="$(( k - 1 ))"
done

您的格式已损坏:

echo "Input number"; read k; while test $k != 0; do
    echo "$k"; k="$(( k - 1 ))"; done

似乎对我来说工作正常:

Input number
3   <- this is what you enter
3   <- this is the beginning of the loop
2
1

尝试

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
echo "Input number"
read k
seq $((k-1)) -1 1

或者

#!/bin/bash
#Print decremental numbers based on user input
#n...8 7 6 5 4 3 2 1
echo "Input number"
read k
while test $k -gt 1; do
    k=$((k-1))
    echo "$k"
done

使用 forseq 是最优雅的:

for i in `seq 5 -1 1`; do
    echo $i
done

输出:

5
4
3
2
1

相关内容

  • 没有找到相关文章

最新更新