카운트다운 스크립트가 작동하지 않습니다

카운트다운 스크립트가 작동하지 않습니다

나는 내가 지정한 숫자에서 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를 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, 다음과 같이 몇 가지 사항만 변경하면 됩니다.

  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해당 인수와 같고, 그렇지 않으면 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; <숫자> = 임계값 숫자

또는:

./<script_name> <threshold_number>

*<script_name> = 스크립트 이름 bash; <숫자> = 임계값 숫자

관련 정보