
나는 내가 지정한 숫자에서 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
를 0으로 카운트다운하도록 변경했습니다 .
⠀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
; <숫자> = 임계값 숫자
또는:
./<script_name> <threshold_number>
*<script_name> = 스크립트 이름 bash
; <숫자> = 임계값 숫자