我正在尝试创建一个脚本,该脚本将从我提供的任何数字开始倒数到 0。下面是我的脚本,基本上什么都没发生,没有错误消息,我只是得到了标准命令行提示符。
#!/bin/bash
#countdown
#counts down to 0 from whatever number you give it
#displaying a number each second
NUM=${1:-0}
if [ $NUM -gt 0 ]
then
while [ $NUM -gt 0 ]
do
if [ -f /usr/bin/banner ]
then
/usr/bin/banner "$NUM"
else
echo $NUM
fi
NUM=$(($NUM-1))
sleep 2
done
fi
答案1
#!/bin/bash
printf "Type an integer number: " && read NUM
if [ $NUM -gt 0 ]
then
while [ $NUM -ge 0 ]
do
if [ -f /usr/bin/banner ]
then
/usr/bin/banner "$NUM"
else
echo $NUM
fi
NUM=$(($NUM-1))
sleep 2
done
fi
输出:
:~$ ./countdown.sh
Type an integer number: 10
10
9
8
7
6
5
4
3
2
1
0
解释:
⠀1. 第 3 行提示用户输入一个整数并将其读入变量 NUM。
⠀2. 将-gt
第 6 行中的更改为-ge
,使其倒计时到零。⠀3
. 如果安装了 sysvbanner,则输出以横幅格式显示,否则以文本显示。
答案2
改进并注释的代码:
#!/bin/bash
num=${1:-undefined} # If $1 (the first argument passed to the script) is set, then num=$1, else num=undefined.
cmd=$(which {banner,echo} | head -1 | xargs basename) # If banner is installed, then cmd=baner, else cmd=echo.
until [[ "$num" =~ ^[0-9]+$ ]]; do # Until $num become a valid number (loop will not be executed if $1 is set):
read -p "Type a number: " num # Ask the user for a valid number.
done # End of the until loop.
for ((num;num>=0;num--)); do # Loop using $num as variable; while $num is greater or equal than zero; num=$num-1.
$cmd $num # Runs $cmd (banner or echo) passing $num as argument.
sleep 1 # Stop the program execution for one second.
done # End of the for loop.
上面的代码将在倒计时中包含零,如果你想在倒计时到达时停止1,那么你只需要做一些修改:
在第 6 行中,将其更改
^[0-9]+$
为^[1-9]+[0-9]*$
如下形式:until [[ "$num" =~ ^[1-9]+[0-9]*$ ]]; do # Until $num become a valid number (loop will not be executed if $1 is set):
在第 10 行,删除
=
符号,使其看起来像这样(我也更新了注释):for ((num;num>0;num--)); do # Loop using $num as variable; while $num is strictly greater than zero; num=$num-1.
您的原始程序无法运行,因为:
- 您没有将数字作为参数传递给程序。
- 此命令的一个示例调用是数字在
./countdown 5
哪里。5
如果您想处理这个问题,您可以
else
在代码中添加一个(看最后五行):#!/bin/bash #countdown #counts down to 0 from whatever number you give it #displaying a number each second NUM=${1:-0} if [ $NUM -gt 0 ] then while [ $NUM -gt 0 ] do if [ -f /usr/bin/banner ] then /usr/bin/banner "$NUM" else echo $NUM fi NUM=$(($NUM-1)) sleep 2 done else echo "Error: number not specified." echo "Usage: $0 <number>" exit 1 fi
NUM=${1:-0}
方法:
${PARAMETER:-WORD}
如果参数
PARAMETER
未设置(从未定义)或为 null(空),则此参数将扩展为WORD
,否则将扩展为 的值PARAMETER
,就好像它只是 一样${PARAMETER}
。echo "Your home directory is: ${HOME:-/home/$USER}." echo "${HOME:-/home/$USER} will be used to store your personal data."
如果
HOME
未设置或为空,每次您想要打印一些有用的内容时,都需要输入该参数语法。
来源: http://wiki.bash-hackers.org/syntax/pe#use_a_default_value
在你的情况下,这意味着,如果你向脚本传递了一个参数,NUM
将等于该参数,否则,NUM
将等于0
答案3
该行表示如果将参数传递给脚本,则将NUM=${1:-0}
变量NUM
设置为,如果根本没有传递参数,则设置为。这解释了为什么你根本没有输出;如果脚本在执行时没有传递参数,则阈值始终设置为,例如:$1
0
0
bash <script_name>
*<script_name> = 您的bash
脚本的名称;
或者:
./<script_name>
*<script_name> = 您的bash
脚本的名称;
因此,您真正需要做的就是在执行时将阈值数字传递给您的脚本,即:
bash <script_name> <threshold_number>
*<script_name> =bash
脚本的名称;<number> = 阈值
或者:
./<script_name> <threshold_number>
*<script_name> =bash
脚本的名称;<number> = 阈值