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
명령어가 와서 탈출 시켜줘야 할 곳 입니다.
shift
는 bash 에 기본으로 내장되어있는 명령어이며,
왼쪽으로 파라미터를 이동하거나, 옮기는 명령어입니다.
이동된 가장 왼쪽에 있는 인수들은 제거됩니다.
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 : 즉흥적으로
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introduction to Docker' 카테고리의 다른 글
MongoDB vs Relational databases - NoSQL vs RDBMS 비교 (0) | 2024.08.15 |
---|---|
Best practices for bash scripts - bash 스크립트를 연습하는 최고의 방법 (1) | 2024.08.13 |
Arithmetic operations - bash에서 수학 연산 사용하기 (0) | 2024.08.10 |
What is MongoDB - MongoDB 기초 및 설치 (0) | 2024.08.10 |
NoSQL - NoSQL 데이터베이스 (1) | 2024.08.08 |