Hyperskill - 컴퓨터 CS 및 영어 독해/Introduction to Docker

Best practices for bash scripts - bash 스크립트를 연습하는 최고의 방법

코딩크리처 2024. 8. 13. 20:26

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 문법


bashcase 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 - 함수


bashFunctions(함수) 는 재사용적인 코드의 조각이며,

이 코드는 스크립트 내부에서 여러 번 부를 수 있습니다.

이는 스크립트를 쉽게 유지보수 할 수 있게 도와줍니다.

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 : 이상한, 독특한, 묘한,