カウントダウンスクリプトが動作しない

カウントダウンスクリプトが動作しない

指定した数字から 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
. -gt6 行目の を に変更して、-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.

上記のコードではカウントダウンにゼロが含まれますが、カウントダウンが0に達したら停止したい場合は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コードに を追加できます (最後の 5 行を参照)。

    #!/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その引数と等しくなり、そうでない場合NUM0

答え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> = しきい値

関連情報