
指定した数字から 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.
上記のコードではカウントダウンにゼロが含まれますが、カウントダウンが0に達したら停止したい場合は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
コードに を追加できます (最後の 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
その引数と等しくなり、そうでない場合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> = しきい値