Loading [MathJax]/jax/output/CommonHTML/jax.js

hyperskill - Case statement and argument parsing 영어 원문

bash 는 조건문을 포함한 다양한 기능들을 제공합니다.

우리는 이미 if-else 문법을 살펴보았으며, 심지어 이 문법이 작업을 수행했음에도 불구하고,

우리는 다른 방식을 살펴 볼 것 입니다.

case 문법은 여러개의 조건문들이 있을 때 읽기 쉽습니다.

이러한 점 때문에, case 문법은 프로그래머의 좋은 무기입니다.


Case statements - Case 문법 (Case - 상황에 따른)


첫 번째로, bash 에서 케이스 문법에 대한 일반적인 문법을 살펴 봅시다.

case $variable in
  condition-1 )
    commands;;
  condition-2 )
    commands;;
  condition-3 )
    commands;;
  condition-N )
    commands;;
  * :
    commands;;
esac

우리는 if-else 문법을 bash 에 구현해 볼 것이며,

그리고 나서 이를 case(케이스) 문법으로 대신 구현했을 때 어떻게 생겼는지 볼 것 입니다.

우리는 script.sh 라는 파일에 우리의 스크립트를 작성 할 겁니다.

#!/usr/bin/env bash

if [[ "${1}" == "" ]]; then
        echo "No option was selected. == 어떠한 옵션도 선택되지 않음. "

elif [[ "${1}" == "1" ]]; then
        echo "You selected '1'. == 당신은 1 을 선택했습니다."

elif [[ "${1}" == "2" ]]; then
        echo "You selected '2'. == 당신은 2 를 선택했습니다."

elif [[ "${1}" == "3" ]]; then
        echo "You selected '3'. == 당신은 3 을 선택했습니다."

else
        echo "Unknown number '${1}'."

fi

같은 논리를 케이스 문법을 사용하여 구현한다면, 이와 같습니다 :

#!/usr/bin/env bash

case "${1}" in

    "")
        echo "No option was selected == 아무런 옵션도 선택되지 않음."
        ;;
    1)
        echo "You selected '1'."
        ;;
    2)
        echo "You selected '2'."
        ;;
    3)
        echo "You selected '3'."
        ;;
    *)
        echo "Unknown Number '${1}'"
        ;;
esac

case 문법과 if 문법을 비교했을 때, 물론 케이스문이 더 읽기 쉽습니다.

케이스문법은 좀 간단하고 직관적입니다.

케이스문법은 만약 값이 이미 정의된 또다른 값과 일치하는지 확인하고,

이에 기반하여 명령어들을 실행합니다.

case 문법은 case 로 시작하며, 어떤 조건에서 작동할지 결정하기 위하여 값을 지정합니다.

이후에, 우리는 in 을 작성하고, 우리의 조건들을 설정합니다.

각각의 조건의 마지막은 ) 로 표시되며, 이에 대해 알맞는 명령어가 작성됩니다.

명령어의 끝은 ;; 입니다.

모든 우리의 조건들을 명시 한 후, 우리는 default(기본, 나머지)의 경우를 추가합니다.

이는 * 조건을 사용하여 완료합니다.

우리는 case 명령어를 거꾸로 작성함으로서 케이스 문법을 종료할 수 있습니다. : esac


The shift statement - shift(시프트) 문법


긴 요소의 리스트와 작업 할 때, 이들이 처리 된 후, 스킵하는 것이 이상적일 수 있습니다.

이러한 상황이 shift 명령어가 와서 탈출 시켜줘야 할 곳 입니다.

shiftbash 에 기본으로 내장되어있는 명령어이며,

왼쪽으로 파라미터를 이동하거나, 옮기는 명령어입니다.

이동된 가장 왼쪽에 있는 인수들은 제거됩니다.

shift 명령어는 얼마나 많은 위치들이 이동되어야 하는지 결정하는 정수를 인수로서 가지고 있습니다.

이 명령어에 대한 구문은 shift n 입니다.

n 은 명령어에 대한 인수입니다.

우리가 만약에 인수를 주지 않는다면, 기본 값은 1 입니다.


shift 명령어를 구현하는 bash 스크립트를 살펴 봅시다.

우리가 가진 밑의 스크립트는 다중 선택 질문을 파라미터로서 답안을 가지고 있습니다.

answers of multiple-choice quesions as parameters

이 의미가 어떤 식으로 해석되어야 하는지 애매함.

여기, 이 예시는 주어진 질문(인수) 를 넘어가거나, 음수 인덱스를 피하는 능력을 가지고 있습니다.

최대한 의역한 것인데, 의미가 굉장히 애매함.

이 예시는 - or -- 중에 하나이면 대답을 넘어갑니다.

#!/usr/bin/env bash

answers=("a" "d" "c" "a" "a")
total_score=0

for (( i = 0; i < 5; i++));
do
    case "${1}" in

        ${answers[i]})
            ((total_score++))
            ;;
        "-"|"--")
            ;;
        *)
            ((total_score--))
            ;;

    esac
    shift 1
done

echo "Total score is: $total_score"

밑의 명령어와 함께 프로그램을 실행하세요 :

bash script.sh a d -- c a

명령어 후에 이와 같은 결과물을 제공합니다 :

Total score is: 2

shift 명령어는 인수를 하나씩 움직인다고 생각하면 된다.

예를 들어, 1,{2}, ${3} 이와 같이 접근 할 수도 있겠지만,

shift 명령어를 통해 마지막까지 인수를 받을 수도 있다는 것이다.



위의 스크립트는 프로그램에게 주어진 5가지 인수가 answers 배열과 순서가 일치하는지 확인한다고 생각하면 된다.

하나가 일치 할 경우 +1, 일치하지 않을 경우 -1, -- or - 일 경우, 스킵한다.

케이스문의 ${1} 는 첫 번째 인수를 선택합니다.

이 경우, a 는 케이스문에 전달됩니다.

케이스문법의 첫 번째 조건이 만족되었습니다.

점수는 total_score 에 추가됩니다.

같은 일이 두 번째 인수에도 일어납니다. : d

세 번째 인수는 두 번째 조건 을 만족합니다.

네 번째 인수는 배열과 일치하지 않으므로, 세 번째 조건을 만족합니다.

이러할 경우, total_score 은 1이 감소합니다.

하지만, 다섯 번째 인수는 total_score 을 2 로 되돌려 놓습니다.


루프의 각 반복에서, 프로그램을 인수들을 왼쪽으로 이동시킵니다.

인수들을 나열한 물체들로 생각하고, 이들을 손으로 왼쪽으로 1칸 이동시켰다고 생각하면 된다.

이유는 ${1} 가 모든 인수들을 잡는 데 사용할 수 있기 때문입니다.

물론, 우리는 ${2}, ${3}, ${4} 들을 인수에 접근하는 데 사용하지 않았습니다.

이러한 식으로 직접 접근하는 것은 훨씬 더 쉬우며, 간단합니다.


Multiple arguments in a condition - 조건문과 다중 인수


당신이 알아챘듯이, 위의 두 번째 조건은 두 가지 선택지를 가지고 있습니다.

- or -- 둘 다 조건을 만족할 수 있습니다.

이는 비트별 연산자(|) 의 도움으로 완료됩니다.

| 라는 비트별 연산자는 바이너리 영역에서 OR 연산을 수행합니다.

이러한 연산자는 약간 OR 연산자처럼 작동하여,

-, -- 인수가 부정적인 답 대신 답안을 스킵하도록 사용 할 수 있습니다.

즉흥적으로 이 | 비트별 연산자와 함께 간단한 구현을 이전의 예제 에 구현 해 봅시다.

#!/usr/bin/env bash

case "${1}" in

    "")
        echo "No option was selected. == 어떤 선택도 없음."
        ;;
    1 | 'a')
        echo "You either selected '1' or 'a'. == 당신은 1 혹은 a 를 선택했습니다."
        ;;
    2 | 'b')
        echo "You either selected '2' or 'b'. == 당신은 2 혹은 b 를 선택했습니다."
        ;;
    3 | 'c')
        echo "You either selected '3' or 'c'. == 당신은 3 혹은 c 를 선택했습니다."
        ;;
    *)
        echo "Unknown character '${1}'."
        ;;
esac

여기, 두 번째, 세 번째, 네 번째 조건들이 작성된 두 개의 인수에 의해 만족될 수 있습니다.


Conclusion - 결론


우리는 케이스 문법을 살펴보았으며, 자세하게 인수를 파싱하는 것을 보았습니다.

우리가 논의했던 주요한 포인트들은 :

  • 케이스 문법들은 if-else 문법과 같은 조건문입니다.
  • 케이스 문법들은 읽기, 유지보수, 디버깅이 쉽습니다.
  • shift 명령어는 왼쪽으로 인수들을 이동하는 것을 도와줍니다.
  • shift 명령어는 인수의 수를 정수로 가지고 있습니다.
    구문은 shift n이며, n 은 양수입니다.
  • | 비트별 연산자는 조건에서 다중 인수를 포함하는 데 사용 될 수 있습니다.


words to remember


arsenal : 병기고

bitwise : 비트별

somewhat : 약간

improvise : 즉흥적으로