Best practices for bash scripts - bash 스크립트를 연습하는 최고의 방법
hyperskill - Best practices for bash scripts 영어 원문
Bash 는 우리의 운영체제를 더 효율적으로 접근 하게 도와주며,
단조로운 업무들을 자동화 해 주며, 파일 작업하는 것을 쉽게 만들어 줍니다.
전반적으로, 우리의 삶을 더 쉽게 만듭니다.
bash 스크립트 파일들이 많은 명령어들을 담고 있는 것 처럼,
이들은 일관성 있으며, 읽고 유지보수하기 쉬우며, 효율적입니다.
당신의 목표 성취를 도와줄 수 있는 몇 가지 방식들을 살펴 봅시다.
Script example - 스크립트 예제
여기에 더하기 와 빼기 에 대한 기능을 제공하는 간단한 bash script 가 있습니다.
#!/usr/bin/env bash
set -euo pipefail
function add() {
echo $(( $1 + $2 ))
}
function subtract() {
echo $(( $1 - $2 ))
}
case $1 in
add )
add $2 $3;;
subtract )
subtract $2 %3;;
* )
echo "unknown operation";;
esac
이러한 스크립트를 어떻게 조직하는지 이해하기 위해서, 파일을 여러 개의 부분으로 나눠 봅시다 :
set
옵션에 대한 설명e
: 첫 번째 실행 실패시 쉘 스크립트 종료 (없는 파일, 디렉토리, 오타 등의 오류)x
: 맨 윗줄 #! 뒤에 작성하여 사용이 가능함. 디버깅 시에 주로 사용한다. (변수값 확인시 유용하다)u
: 정의되지 않은 변수 사용시 에러메세지 출력o
:o: on
+o: off
앞에 작성한 옵션 사용여부 지정pipefail
: 모든 명령어true
인 경우,true
를 출력한다.출처 :
: velog 글
Shebang - 쉬뱅
넓은 의미로, shebang(쉬뱅) 은 #!
로 시작하는 문자 시퀀스(순열) 입니다.
당신이 아마 알아차렸듯이, shebang(의미는 오두막임) 인 #!/usr/bin/env bash
는 경로를 재구성한 것 입니다.
이는 bash script 를 실행하기 위해 사용하는 bash 인터프리터의 경로입니다.
만약에 shebang 이 지정되지 않았다면,
해당 파일 확장자에 대해 사용되는 기본 인터프리터가 지정됩니다.
하지만, 쉬뱅이 사용 될 때에는, 지정된 인터프리터가 스크립트를 실행합니다.
예제에서 이것이 어떻게 작동되는지 더 깊게 들어가 봅시다.
기본적으로, 서로 다른 확장자를 가진 서로 다른 스크립트들은,
서로 다른 인터프리터를 사용하여 실행합니다.
.sh
스크립트는 sh
인터프리터를 사용하여 실행 할 것이며,
반면에 .bash
스크립트는 bash
인터프리터를 사용하여 실행 할 겁니다.
sh
의 상위집합인 Bash 는 몇 가지 추가적인 기능들을 제공합니다.
당신이 bash
인터프리터와 함께 파일을 실행하기 위해 스크립트 파일을 작성할 때,
당신은 bash 인터프리터에 대한 shebang 을 지정 할 겁니다.
shebang은 언제나 스크립트의 첫 번째 줄에 있어야 한다는 것을 절대 잊지 마세요.
아니라면, 쉬뱅이 주석으로서 번역 될 겁니다.
Error handling - 에러 핸들링
bash script 를 작업하는 것은,
bash shell 를 작업하는 것과는 약간 다릅니다.
당신이 script 파일을 생성 할 때, 당신은 확실한 목표를 가지고 있습니다.
우리는 각각의 명령어를 수동으로 실행할 수 없기 때문에,
전체적인 스크립트 내의 에러들을 적절히 다루는 것이 중요합니다.
이를 수행하기 위해서, 이 명령어 줄을 사용하세요 : set -euo pipefail
이 명령어는 3 부분으로 이루어져 있습니다 :
set -e
기본적으로, bash 는 스크립트를 정지시키지 않습니다.
이 옵션은 bash shell 을 작동할 때 유용하지만,
bash script 를 실행 할 때는 유용하지 않습니다.
set -e
옵션은 에러를 맞닥뜨렸을 때 즉시 bash 를 탈출합니다.
set -u
이 옵션은 프로그램이 지정되지 않은 변수를 참조하였을 때 자동적으로 탈출합니다.
set -o pipefail
파이프라인의 명령어가 실패했을 때, 마지막으로 실행된 명령어 코드를 반환합니다.
즉, 실패의 원인이 되는 명령어를 반환하기 위해서는, set -o pipefail
을 사용합니다.
우리는 이러한 세 가지 명령어들을 개별적으로 사용 할 수 있습니다.
하지만 이들을 결합하는 것은 훨씬 더 편리합니다.
Case statement - Case 문법
bash 의 case statement 는 조건문의 유형입니다.
케이스 문법들은 가독성이 더 쉬우며, 또한 유지보수에도 쉽습니다.
케이스 문법은 이미 정의된 값이 확인하는 값과 일치하는 지 확인하며,
후자에 연결된 명령어들을 실행합니다.
밑의 예제는 bash 에서의 간단한 케이스 문법의 예제입니다.
case $variable in
condition-1 )
commands;;
condition-2 )
commands;;
condition-3 )
commands;;
condition-N )
commands;;
* )
commands;;
esac
문법은 case
로 시작하며, 그리고 나서 어떠한 조건에 작동할 값 을 지정합니다.
그 이후에, in
을 작성하고 나서 우리의 조건들을 지정합니다.
각 조건의 끝은 )
로 표시되며, 이후에는 이에 알맞는 명령어들을 작성합니다.
그리고 명령어들의 끝은 ;;
입니다.
우리의 모든 조건들을 지정하고 난 후, 우리는 default 즉, 기본 조건을 추가합니다. : * )
이는 *
를 사용하여 완료됩니다.
케이스 문법의 끝을, case
를 반대로 작성하는 것으로 종료합니다. : esac
Functions - 함수
bash 의 Functions(함수) 는 재사용적인 코드의 조각이며,
이 코드는 스크립트 내부에서 여러 번 부를 수 있습니다.
이는 스크립트를 쉽게 유지보수 할 수 있게 도와줍니다.
bash 에서 함수를 구현하는 것을 살펴 봅시다 :
function function_name_multiplier() {
echo $(( $1 * $2 ))
}
더 가까이 살펴보면 우리의 함수에서 독특한 무언가를 들춰낼 수 있습니다.
$1
과 $2
가 입력값으로서 주어진 값들이 함수에 순서대로 참조되었습니다.
function_name_multiplier 2 5
를 사용하여 함수를 실행하면, 결과는 10
입니다.
ShellCheck - 쉘체크 (스크립트 에디터)
Java, Python, JavaScript 와 같은 프로그래밍 언어들과 작업 할 때,
최고의 방법은 코드 에디터나 IDEs 를 사용하는 것 입니다.
또한 이들은 에러를 찾아내거나, 추천을 제공합니다.
운 좋게도, bash script 를 작업하는 비슷한 프로그램이 있습니다. - ShellCheck : 웹 페이지임.
ShellCheck 는 깃허브 페이지에 명시된 것과 같이,
bash/sh 스크립트에 대한 경고와 추천들을 제공합니다.
한 번 이 도구를 실제로 사용 해 봅시다 :


Conclusion - 결론
이번 주제에서, 우리는 더 나은 스크립트들을 작성하게 도와주는,
bash script 에 대한 몇 가지 예제들을 살펴보았습니다 :
- 스크립트에 shebang 으로 지정된 인터프리터로 시작합니다.
- 에러를 다루기 위해서
set -euo pipefail
줄을 작성하세요. - case statement(케이스 문법) 으로 주어진 인수들을 파싱해 보세요.
- 각각의 명령어를 분리된 함수로 묘사하세요.
- 최고의 방법을 따르기 위해 우리의 코드를 ShellCheck 에서 확인하세요.
words to remember
monotonous : 단조로운
whereas : 반면에
somewhat : 약간, 얼마간
halt : 정지, 멈추다, 정지시키다, 휴지시키다
reveal : 드러내다, 보이다, 들추다
peculiar : 이상한, 독특한, 묘한,