倒计时脚本不起作用

倒计时脚本不起作用

我正在尝试创建一个脚本,该脚本将从我提供的任何数字开始倒数到 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,那么你只需要做一些修改:

  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):
    
  2. 在第 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设置为,如果根本没有传递参数,则设置为。这解释了为什么你根本没有输出;如果脚本在执行时没有传递参数,则阈值始终设置为,例如:$100

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> = 阈值

相关内容