我正在尝试通过用户输入进行自动反向计数。错误是我不断两次获得序列中的第一个数字。
#!/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
将关闭read
的echo
效果
#!/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
使用 for
和 seq
是最优雅的:
for i in `seq 5 -1 1`; do
echo $i
done
输出:
5
4
3
2
1