Linux 셸 스크립팅에 대해 더 배우고 싶지만 어디서부터 시작할지 모르는 적이 있나요? 유닉스 기반 운영 체제에 상대적으로 새로운 사용자이고 기본적인 셸 프로그래밍을 수행하려는 경우에는 어떻게 해야 할지 궁금할 수 있습니다. 이 초보자용 자습서에서는 Bash를 사용하여 Linux 셸 스크립팅의 기본 사항을 다루며, 스크립트 생성 및 실행, 문자열 및 루프 작업에 대해 설명합니다.
셸 스크립팅은 일반 관리 작업을 자동화하는 데 사용됩니다
운영 체제에 관계없이 셸 스크립트는 반복적인 관리 작업을 자동화하는 데 사용됩니다. 예를 들어, Windows에서 파일 탐색기를 사용하여 파일 이름을 바꿀 수 있습니다. 그러나 많은 파일의 이름을 바꾸어야 하는 경우 그래픽 셸을 사용하는 것은 시간이 많이 걸릴 수 있습니다. PowerShell을 사용하면 작업을 자동화하고 안정적으로 반복 수행할 수 있습니다.
Linux 기반 운영 체제에서는 파일 작업, 시스템 구성 수정 등과 같은 작업을 자동화하기 위해 Bash 및 기타 셸이 사용되며, 이러한 작업들은 단일 명령을 입력함으로써 수행할 수 있었던 작업들입니다.
Bash 셸 스크립팅을 배우기 위해 필요한 것
Bash 스크립트를 작성하고 실행하려면 세 가지만 있으면 됩니다:
- 아무 일반 텍스트 편집기, 예를 들어 Notepad, Text Editor, TextEdit, vi, emacs 또는 Visual Studio Code입니다.
- A terminal emulator, an application that comes preinstalled with most operating systems and is often called Terminal, Console, or Command Prompt.
- Bash 자체입니다.
터미널 에뮬레이터는 명령어를 입력하고 Enter 또는 Return 키를 눌러 실행하는 곳입니다. Bash의 경우 미리 설치되어 있는지는 플랫폼에 따라 달라질 것입니다:
- macOS의 경우, Bash가 미리 설치되어 있습니다. 최신 버전에서는 기본 셸로 Z 셸 (zsh)이 설정되어 있고 괜찮습니다. Bash가 설치되어 있다면 zsh에서도 Bash 스크립트를 실행할 수 있습니다.
- Linux 배포판에서는 일반적으로 Bash가 설치되어 있습니다. (시스템에 /bin/bash 파일이 포함되어 있는지 확인하여 확인할 수 있습니다.) Android는 Bash가 탑재되어 있지 않은 특별한 경우입니다. Android에 Bash를 설치하는 방법에는 이 기사에서 다루지 않습니다.
- Windows은 Bash가 번들로 제공되지 않습니다. PowerShell은 Windows의 기본 명령줄 셸입니다. Bash를 실행하려면 Windows Subsystem for Linux (WSL)에 Linux 배포본을 설치해야 합니다.
Bash 버전을 확인하려면 bash –version 명령을 실행하십시오. 더 오래된 Bash 버전도 많은 기능을 제공하지만, Bash 3와 4는 특정 기본 명령에 대한 간략한 표기법을 도입했습니다. 이러한 버전의 Bash가 필요한 명령이 있는 경우 아래에 언급될 것입니다.
셸(shell)이란?
컴퓨팅 세계에서 셸(shell)은 기본 운영 체제의 인터페이스로 작동하는 프로그램입니다. 셸은 Windows 셸과 같이 그래픽 사용자 인터페이스(GUI)일 수도 있습니다.
셸 스크립트 언어
그러나, 사람들은 일반적으로 용어를 명령 줄 인터페이스 (CLI)에만 구체적으로 참조합니다. 이는 키보드만 사용하여 상호 작용하는 텍스트 줄로 구성된 인터페이스입니다. 다음은 *nix 운영 체제를 위한 몇 가지 쉘 스크립트 언어 예시입니다:
여기서는 배시 쉘에 초점을 맞출 것입니다. 이는 대부분의 리눅스 배포판 및 macOS에 미리 설치된 인기있는 무료 유닉스 쉘입니다.
쉘 스크립트란 무엇인가요?
쉘은 자체 프로그래밍 언어를 갖고 있습니다. 이 언어를 사용하여 명령을 쉘로 보내고, 쉘은 이후 해당 명령을 실행합니다. 이러한 명령은 직접 쉘에 입력할 수도 있고, 파일 – 즉 스크립트 -에 저장한 다음 해당 파일을 쉘에서 실행할 수도 있습니다. 명령을 작성하는 구문은 두 경우 모두 동일합니다.
이 기사에서는이 파일을 작성하기 위한 쉘 스크립트 기본 사항을 다룰 것입니다.
기본 쉘 스크립팅
기본 쉘 스크립팅으로 시작해 보겠습니다. 리눅스에서 간단한 스크립트를 작성하기 위해 몇 가지 간단한 쉘 스크립트 명령을 배워봅시다:
- 텍스트 편집기에서 새로운 빈 텍스트 파일을 만듭니다.
- 첫 줄에
#!/bin/bash
를 작성합니다. - 해당 줄 아래에 명령을 입력합니다.
- 파일을 저장합니다, 가능하면 “.sh” 확장자 또는 확장자 없이 저장합니다.
#!/bin/bash
줄은 “shebang”이라고 불립니다. 이는 쉘에 해당 스크립트를 Bash로 실행해야 함을 알려주며 스크립트의 첫 줄이어야 합니다. 다른 쉘로 전환하더라도 스크립트는 여전히 Bash에서 실행됩니다.
이 프로세스를 직접 시도하려면 홈 디렉터리에 ‘hello_world’라는 이름의 파일을 만듭니다.
#!/bin/bash echo "hello world"
여기까지입니다 — Bash 스크립트를 만들었습니다!

실행하려면 아마도 파일 권한을 변경해야 할 것입니다.
chmod를 사용하여 셸 스크립트를 실행할 권한을 설정하는 방법
우리 ‘hello_world
’ 파일의 권한을 수정하려면 터미널 에뮬레이터에서 특정 명령을 실행합니다. 이는 파일을 소유한 사용자에게 파일을 실행할 권한을 부여합니다.:
chmod u+x 'hello_world'

만약 쉘 스크립트를 실행하고 싶다면, 다음 섹션으로 건너뛰실 수 있습니다. chmod
명령어에 호기심이 있는 분들을 위해, chmod
은 “change mode”의 줄임말로 Unix에서 파일 “모드”(또는 권한)를 변경하는 데 사용됩니다. Unix와 유사한 운영 체제에서는 사용자 3 클래스에 대해 파일 권한을 설정할 수 있습니다:
- 파일을 소유한 사용자(
u
로 나타냄). - 파일을 소유한 그룹(
g
). - 다른 사용자(
o
).
chmod
명령어를 사용하면 이들 모두를 가리키기 위해 a
를 사용할 수도 있습니다.
각 파일에는 3 종류의 권한(또는 “모드”)이 있습니다:
- 읽기(
r
) - 쓰기(
w
) - 실행(
x
)
또한 추가하기(+
)나 제거하기(-
)도 가능합니다.
chmod의 첫 번째 매개변수는 사용자 먼저, 동작 다음, 모드가 세 번째인 이 세 가지의 조합입니다. 여기 몇 가지 명령 예시가 있습니다:
chmod gu+rw 'hello_world'
는 소유자와 소유 그룹에 읽기 및 쓰기 권한을 추가합니다.chmod a-x 'hello_world'
는 모든 사용자의 실행 권한을 제거합니다.chmod u+rwx 'hello_world' 'hello_world_2'
는 소유자에게 “hello_world” 및 “hello_world_2” 파일을 읽고 쓰고 실행할 수있는 권한을 부여합니다.
여기에서는 chmod
명령어의 매우 기본적인 내용만 다뤘습니다. 이 외에 이러한 모드를 정의하는 더 복잡하지만 덜 장황한 방법(“숫자 표기법”)과 파일의 권한을 확인할 수있는 다른 명령어도 있습니다(ls -l
). 이러한 주제에 대해서는 다루지 않겠습니다.
셸 스크립트 실행
첫 번째 스크립트를 실행해 봅시다. 일반적으로 스크립트를 실행하려면 터미널 에뮬레이터에 해당 경로를 입력하고 엔터를 누르면 됩니다.
./hello_world
상대 경로나 절대 경로를 사용할 수 있습니다. 상대 경로를 사용할 때는 명령어의 처음에 ./
를 항상 사용하세요: 이렇게 함으로써 터미널에게 '.'
로 표시된 현재 폴더가 아닌 PATH
환경 변수에 정의된 디렉터리에서 찾지 말라고 알려줍니다.

스크립트에 주석 추가하기
Bash 스크립트의 한 줄에 있는 #
뒤에 오는 모든 것은 주석으로 간주됩니다. 이는 복잡한 명령어가 무엇을 하는지 설명하거나 스크립트의 큰 부분이 무엇을 하는지 요약하는 데 도움이 될 수 있습니다.
예를 들어:
#!/bin/bash # # This shell script prints "hello world". # echo "hello world" # This line prints "hello world".
변수 소개
스크립트를 작성할 때 변수를 정의하는 것이 유용할 수 있습니다. Bash에서는 변수 이름과 값을 등호로 구분하여 입력하여 이를 수행합니다: VARIABLENAME='VALUE'
.
등호 옆에 공백을 넣으면 안됩니다 — Bash는 프로세스를 실행하려고 한다고 생각할 것입니다.
값을 둘러싸기 위해 단일 인용부호를 사용하여 Bash가 다른 것으로 해석하도록 하지 않도록 합니다. Bash에서 변수는 유형이 없으며, 모든 것이 기본적으로 문자열입니다. 문자열을 다른 유형으로 구문 분석하는 것은 Bash 프로그램에 달려 있습니다.
변수의 값에 접근하려면, 변수 이름 앞에 달러 기호를 사용하십시오: $VARIABLENAME
.
이를 실제로 해보려면 스크립트를 다음과 같이 변경할 수 있습니다:
#!/bin/bash HELLO="hello variable world" echo $HELLO # should print "hello variable world"
인수 수신
명령을 입력할 때 작성하는 개별 단어를 인수라고합니다. 우리의 chmod u+x 'hello_world'
예에서 chmod
, u+x
, 그리고 'hello_world'
는 세 가지 다른 인수입니다. chmod
는 명령 이름이며 u+x
및 hello_world
은 매개 변수라고 불립니다—명령에 추가 정보를 제공하는 인수입니다.
스크립트에서는 이러한 인수에 변수를 통해 액세스할 수 있습니다. 로컬 변수와의 충돌을 피하기 위해 이러한 변수는 숫자를 사용하여 이름이 지정됩니다 — $0
은 명령 이름을 가리키고, $1
은 그 다음 인수를 나타내며, $2
는 다음 것을 나타내며, 이와 같이 계속됩니다.
이것을 시도해보세요:
#!/bin/bash HELLO="hello $1 world" echo $HELLO
이 매개변수로 스크립트를 실행하십시오:
./hello_world bash script
출력은 hello bash world
여야 하며, 첫 번째 매개변수가 사용되고 두 번째는 무시되어야 합니다.
bash script
을 하나의 매개변수로 보고 싶다면, 따옴표로 넣어야 합니다:
./hello_world 'bash script'

조건에 따라 코드를 실행하는 if 문 사용
스크립트 내에서 프로그래머가 하고 싶어하는 핵심 작업 중 하나는 특정 조건이 충족될 때만 코드 조각을 실행하는 것입니다. Bash에는 그 목적으로 if
문이 있습니다:
NUM=$RANDOM if (( $NUM % 2 )) # if CONDITION then echo "$NUM is odd" fi # this is how you end an if statement
팁:여기부터는 이 예제들이 더 큰 스크립트의 일부로 가정되고 있으며, 앞에 있는 #!/bin/bash
를 생략합니다. 하지만 스크립트의 첫 번째 줄에 놓지 않으면 안 됩니다!
if 문 내부에도 else
를 사용하여 조건이 충족되지 않을 경우에 무엇을 할지 지정하거나, 다른 조건을 지정하기 위해 elif
를 사용할 수 있습니다(“else if“의 줄임말):
NUM=$RANDOM if [ $NUM -eq 12 ] then echo "$NUM is my favorite number" elif (( $NUM % 2 )) then echo "$NUM is odd" else echo "$NUM is even"fi
‘fi‘는 if 문을 닫는 데 사용됩니다.
팁: 조건을 작성하는 방법이 확실하지 않다면 test
, 단일 대괄호 ([]
), 이중 괄호 ((())
) 표기법을 살펴보세요.

for 룹을 사용하여 일련의 명령을 반복하기
이제 코드를 조건부로 실행하는 방법을 다루었으니, 특정 조건이 충족될 때까지 특정 횟수만큼 코드를 실행하는 방법을 살펴봅시다.
for
룹은 이러한 작업에 안성맞춤입니다 — 특히 “세 표현 구문”이 그것입니다. 이 구문의 아이디어는 루프별 변수를 할당하고 특정 조건이 충족될 때까지 점진적으로 변경하는 것입니다. 다음은 이 구조입니다:
for (( ASSIGNMENT_EXPRESSION ; CONDITION_EXPRESSION ; UPDATE_EXPRESSION )) do COMMANDS done
예를 들어, i 값이 0부터 9까지인 루프를 10회 실행하려면 다음과 같이 할 수 있습니다:
for (( i=0; i<10; i++ )) do echo $i done
이를 분해해봅시다:
i=0
is the assignment expression here. It’s run only once before the loop is executed, which is why it’s useful for initializing a variable.i<10
is our condition expression. This expression is evaluated before each iteration of a loop. If it is equal to zero (which means the same as “true” in Bash), the next iteration is not run.i++
is our update expression. It’s run after each iteration of a loop.

목록의 요소를 순환하기
세 표현 구문 외에도, 요소 집합을 나열하고 in
키워드를 사용하여 for
룹을 정의하는 것도 가능합니다. 이 대체 구문은 항목 집합을 반복하는 데 사용됩니다.
가장 기본적인 예는 in
키워드 뒤에 스페이스로 구분된 항목 집합을 나열하는 것입니다. 예를 들어:
for i in 0 1 2 3 4 5 6 7 8 9 # space-separated list items do echo $i done
당신은 명령어에 의해 출력된 항목들을 반복할 수도 있습니다:
for i in $(seq 0 1 9)
일반적으로 명령어 치환에 사용되는 $()
표기법은 해당 명령어를 실행하고 해당 출력물이 주변 부모 명령어의 입력으로 사용됩니다.
정수를 반복하는 경우에는 seq
명령어보다 효율적인 베쉬 내장 범위 구문을 사용하는 것이 좋습니다. 그러나 이 구문은 최근의 베쉬 버전에서만 사용할 수 있습니다:
for i in {0..9}
, Bash 3에서 사용 가능합니다.for i in {0..9..1}
, Bash 4에서 사용 가능하며, 마지막 숫자는 증가량을 나타냅니다.
이와 마찬가지로, 문자열을 통해 반복할 수도 있습니다:
for s in 'item1' 'item2' 'item3'
패턴과 일치하는 파일 가져오기에 Globbing 사용하기
이전 섹션에서 논의된 for 루프의 일반적인 사용 사례 중 하나는 개별 파일을 반복하는 것입니다.
이를 해결하기 위해 먼저 “글로브 확장”이라고 불리는 것에 대해 다루어야 합니다. 이것은 Bash에서 파일 이름을 패턴 매칭을 사용하여 지정할 수 있도록 하는 기능입니다. 이 패턴을 정의하는 데 사용되는 특수 문자인 와일드카드가 있습니다.
이를 자세히 살펴보기 전에 몇 가지 구체적인 예시를 살펴봅시다:
echo *
: 현재 디렉토리에 있는 모든 파일의 이름을 반환하는 명령어이며, 숨겨진 파일을 제외합니다.echo *.txt
: 현재 디렉토리에 있는 .txt 확장자가 붙은 모든 숨겨지지 않은 파일의 이름을 반환하는 명령어입니다.echo ????
: 현재 디렉토리에 있는 네 글자인 파일 이름을 반환하는 명령어입니다.
여기서 사용한 와일드카드는 *와 ?입니다. 사용하지 않은 추가 와일드카드 하나가 더 있습니다. 개요는 다음과 같습니다:
- 별표 (
*
)는 파일이나 디렉토리 이름에서 0을 포함한 임의의 문자열을 나타냅니다. - 물음표 (
?
)는 파일이나 디렉토리 이름에서 한 글자를 나타냅니다. - 이중 별표 (
**
)는 전체 파일 경로에서의 임의의 문자열을 나타냅니다. 이것은 Bash 4부터의 기능으로,shopt -s globstar
를 실행하여 활성화해야 합니다. - 대괄호 (
[]
)는 파일이나 디렉토리 이름에서 기호 집합 내의 문자를 나타냅니다. 예를 들어[st]ake
는sake
나take
와 같은 파일을 찾지만stake
는 찾지 않습니다.
글로브 확장을 사용할 때 모든 숨겨진 파일(이는 이름이 점 .
으로 시작하는 파일입니다)은 무시됩니다.
대괄호 표기법은 다소 복잡성을 더하며, 다음을 포함합니다:
- 범위는 첫 번째 값과 마지막 값에 의해 정의됩니다 — 예시로,
[1-8]
- 특정 문자를 제거하려면 대괄호 내부의 처음 문자로 !를 사용합니다 — 예시로,
[!3]
이러한 특수 문자 중 하나를 의미 없는 일반 문자로 취급하려면 해당 문자 앞에 역슬래시를 붙입니다 — 예시로, \?
.

for 루프를 사용하여 파일을 반복
지금까지 글롭 확장의 기본 사항을 다뤄보았으니, 파일을 반복하는 방법을 살펴봅시다.
우리는 단순히 for 루프 내에서 글롭 연산자를 사용할 수 있습니다. 현재 디렉토리의 각 파일 이름을 인쇄하는 루프의 간단한 예는 다음과 같습니다:
for f in * do echo $f done
현재 디렉토리와 하위 디렉토리의 각 파일 이름을 인쇄하려면, bash --version
을 실행하여 Bash 4.0 이상을 실행 중인지 확인한 후, 다음 명령을 실행할 수 있습니다:
shopt -s globstar # enables using ** for f in ** do echo $f done
팁: 이전 버전의 Bash를 실행 중인 경우에는 이를 위해 for 루프로 글로빙을 사용할 수 없습니다. 최선의 해결책은 find
명령이지만, 이 글에서는 그에 대해 다루지 않겠습니다.
이들은 물론 당신이 실행할 수 있는 가장 간단한 루프 중 일부에 불과하지만, 할 수 있는 것은 훨씬 더 많습니다. 예를 들어, 폴더 내의 모든 JPG 파일의 이름을 일관된 연속적인 파일 이름으로 변경하려면 다음과 같이 실행할 수 있습니다:
i=1 for f in *.jpg do mv -i -- "$f" "image_$i.jpg" let i=i+1 done

조건이 참인 동안 코드 실행하기
for 루프는 Bash에서 사용할 수 있는 유형의 루프가 아닙니다. 또한 while
가 있습니다: 이 유형의 루프는 특정 조건이 참인 동안 실행됩니다.
구문은 for 루프 구문과 유사합니다:
while CONDITION do COMMANDS done
실제 예제로, 파일을 줄 단위로 읽어들일 수 있습니다 (선행하거나 후행하는 공백은 제외됨) 파일의 끝에 도달할 때까지:
while read -r line do echo "$line" done < FILENAME # Replace FILENAME with the path to a text file you'd like to read

for 루프를 while 루프로 대체할 수도 있습니다. 예를 들어, 0부터 9까지 반복하는 방법입니다:
i=0 while [ $i -lt 10 ] do echo $i let i=i+1 done
그리고理론적으로 루프를 영원히 실행할 수도 있습니다. 다음은 명령 예제입니다:
while true do echo "running forever" done
팁: 스크립트를 종료하려면 Ctrl+C를 누르십시오.
이 무한 루프는 처음 보았을 때는 쓸모 없어 보일 수 있지만, 실제로는 break
문과 결합할 때 매우 유용할 수 있습니다.
루프에서 탈출하기
break
문은 루프를 탈출하는 데 사용됩니다.
이를 통해 무한 루프를 실행하고 루프를 탈출하는 데 필요한 경우에 탈출할 수 있습니다.
간단한 예를 살펴보면, 무한 루프로 0에서 9까지 반복하는 것을 다음과 같이 복제할 수 있습니다:
i=0while true do if [ $i -eq 10 ] then break fi echo $i let i=i+1 done
여러 겹의 중첩 된 while 루프가있는 경우 break 문 뒤에 숫자를 추가하여 루프에서 빠져 나와야 할 레벨을 지정할 수 있습니다. break 1
은 break
와 동일하며 가장 가까운 주변 루프에서 루프를 빠져 나올 것입니다. break 2
은 하나 위의 루프에서 빠져 나올 것입니다. 등
여기에 빠른 예제를 살펴 보겠습니다. “bash”라는 단어가 나올 때까지 모든 네 글자 단어 조합을 반복하는 for 루프를 사용합니다.
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
A related keyword that’s also worth a mention is continue
, which skips to the next iteration of the loop. Just like break
, it also takes an optional numeric argument that corresponds to the loop level.
여기서 우리가 네 글자로 된 단어 목록에서 E가 들어있는 모든 단어를 건너 뛰는 어리석은 예가 나와 있습니다.
for l4 in {a..z} do if [ $l4 = "e" ] then continue fi for l3 in {a..z} do if [ $l3 = "e" ] then continue fi for l2 in {a..z} do if [ $l2 = "e" ] then continue fi for l1 in {a..z} do if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
우리는 또한 가장 깊은 루프 레벨에서 모든 이러한 continue
문을 수행 할 수 있습니다.
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do if [ $l4 = "e" ] then continue 4 fi if [ $l3 = "e" ] then continue 3 fi if [ $l2 = "e" ] then continue 2 fi if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done

셸 스크립트에서 사용자 입력 받는 방법
가끔은 사용자가 초기 스크립트 인수를 사용하는 대신 스크립트와 직접 상호 작용하도록 하려고 합니다. 이것은 read
명령어가 필요한 곳입니다.
사용자 입력을받고 NAME
이라는 변수에 저장하려면이 명령을 사용하십시오.
read NAME
이것은 명령어 이름과 입력을 저장하려는 변수만으로 구성된 명령의 가장 간단한 형식입니다.
그러나 더 자주 사용하는 것은 사용자에게 무엇을 입력해야 하는지 알리려면 사용자에게 프롬프트를 제공해야합니다. 그것은 -p
인수를 사용하여 수행하며 그 후에 선호하는 프롬프트를 작성합니다.
다음은 이름을 요청하고, 그것을 NAME
이라는 변수에 할당하는 방법입니다:
read -p "Your name: " NAME echo "Your name is $NAME." # this line is here just to show that the name has been saved to the NAME variable

문자열에서 특수 문자 출력
Bash에서 사용하는 데 주의해야 하는 문자가 여러 가지 있습니다. 예를 들어, 파일 이름 내의 공백, 문자열 내의 따옴표 또는 거의 어디서나 백슬래시입니다.
Bash가 특정 위치에서 이들의 특별한 의미를 무시하도록 말하려면 문자를 “탈출”하거나 그 문자를 문자 그대로 따옴표로 감싸야 합니다.
“탈출”은 Bash에게 특별한 의미 없이 그냥 문자로 취급하라고 말하는 것입니다. 그렇게 하려면 그 문자 앞에 백슬래시를 쓰세요.
예를 들어, img \ 01 *DRAFT*라는 파일이 있다고 가정합니다. Bash에서는 다음과 같이 참조할 수 있습니다:
img\ \\\ 01\ \*DRAFT\*
다음은 Bash에서 특수 문자의 비완전 목록입니다:
- 공백: 공백, 탭, 빈 줄
- 따옴표: ”, “”
- 괄호, 중괄호, 대괄호: ( ), { }, [ ]
- 파이프 및 리디렉션: |, <, >
- 와일드카드: *, ?
- 기타: !, #, ;, =, &, ~, `
- 탈출 문자 자체: \
Bash에 익숙하지 않다면, 어떤 문자가 특별한 의미를 가지는지 기억하는 것이 번거로울 수 있습니다. 그런 상황에서 많은 경우 문자 그대로 따옴표를 사용하는 것이 더 쉬울 수 있습니다: 특수 문자를 포함하는 텍스트를 단일 따옴표로 둘러싸면 그 안에 있는 모든 특수 문자가 무시됩니다.
여기 예시에 대한 모습입니다:
'img \ 01 *DRAFT*'
특수 문자를 사용하고 다른 문자를 이스케이프하려면 어떻게 해야 할까요? 백슬래시를 사용하여 매번 다른 문자를 이스케이프할 수 있지만, 특수 문자를 제외한 모든 문자를 문자 그대로 감싸는 것으로 번거로움을 피할 수도 있습니다.
예를 들어, img \ 01 *v1 DRAFT*, img \ 01 *v2 DRAFT*, img \ 01 *ROUGH DRAFT* 등의 여러 파일이 있고 이들 파일 이름을 모두 일치시키기 위해 글롭 확장을 사용하려 한다고 가정해 보겠습니다. 다음과 같이 작성할 수 있습니다:
'img \ 01 *'*' DRAFT*'

작성해야 하는 내용에 홑따옴표가 포함된 경우 — 예: img \ 01 *’FINAL’* — 리터럴 문자열과 이스케이프를 결합하여 유사한 전략을 사용할 수 있습니다:
'img \ 01 '\''FINAL'\'
Bash에서 문자열 연결하는 방법
예를 들어, 이름과 성 같은 두 개 이상의 문자열 변수가 있다고 가정해 보겠습니다:
FIRST_NAME="Johnny"LAST_NAME="Appleseed"
이러한 변수를 하나의 문자열로 결합하려면 사용자 지정 구분자와 함께 이 두 변수로 이루어진 새로운 문자열을 만들면 됩니다:
NAME="$LAST_NAME"', '"$FIRST_NAME"
이를 위해 인라인 변수와 이중 따옴표를 사용할 수도 있으며, 중괄호를 사용하여 변수 이름을 주변 텍스트와 구분할 수 있습니다:
NAME="${LAST_NAME}, ${FIRST_NAME}"
Bash에서는 +=
연산자를 사용하여 문자열에 텍스트를 추가할 수도 있습니다:
NAME='Appleseed'NAME+=', 'NAME+='Johnny'

문자열 내에서 명령 실행
Bash는 또한 명령 교체로도 알려진 문자열 내에서 명령의 출력을 사용할 수 있도록 합니다. 명령을 $()
로 둘러싸기만 하면 됩니다. 예를 들어, 현재 타임스탬프를 출력하려면 다음과 같이 실행할 수 있습니다:
echo "Current timestamp: $(date)"

이 구문을 이전 for 루프 예제에서도 기억할 수 있을 것입니다. 그때 0부터 9까지의 정수 시퀀스를 반복했습니다:
for i in $(seq 0 1 9) do echo $i done
교체된 명령은 하위 셸에서 실행됩니다. 예를 들어, 명령 실행 중에 생성된 변수는 스크립트를 실행하는 환경에 영향을 미치지 않는다는 것을 의미합니다.
셸 스크립트에서 종료 코드 설정 및 반환하기
더 복잡한 스크립트의 경우, 스크립트가 성공적으로 실행되었는지 또는 오류가 발생했는지 여부를 사람들에게 알려주는 0부터 255 사이의 숫자인 exit 코드를 반환하는 것이 통상적입니다.
어떤 숫자를 사용할지에 대해서는 공식 Bash 매뉴얼에서 다음을 명시하고 있습니다:
- 0: 프로그램이 성공적으로 실행됨.
- 2: 프로그램이 잘못 사용됨(예: 잘못된 또는 누락된 인수로 인해).
- 1 및 3-124: 사용자 정의 오류.
- 126: 명령을 실행할 수 없음.
- 127: 명령을 찾을 수 없음.
- 125 및 128-255: 셸이 사용하는 오류 상태. 프로세스가 신호
N
에 의해 종료된 경우, 종료 상태는 128 + N입니다.
숫자 0을 제외한 모든 숫자는 어떤 종류의 오류를 나타냅니다. 종료 코드 1
은 일반적으로 일반 오류에 사용됩니다. 대부분의 경우, 2
보다 높은 종료 코드를 사용할 필요가 없을 것입니다.
스크립트에서 종료 코드를 반환하려면, exit
명령을 사용하면 됩니다. 예를 들어, 코드가 2로 종료하려면 exit 2
라고 작성하면 됩니다.
스크립트에서 exit
명령을 사용하지 않거나 코드를 지정하지 않고 명령을 사용하는 경우, 스크립트에서 마지막으로 실행된 명령의 종료 상태가 반환됩니다.
쉘에서 마지막으로 실행된 명령의 종료 코드를 얻으려면, $? 변수를 사용하면 됩니다: echo $?
.
함수를 호출하는 방법
더 긴 스크립트를 작성하거나 코드 덩어리를 반복하는 경우, 일부 코드를 함수로 분리하고자 할 수 있습니다. 함수를 정의하는 두 가지 형식이 있습니다: 두 경우 모두 함수 코드는 중괄호 안에 포함되며 함수 선언만 다릅니다.
더 간결한 형식은 함수 이름 뒤에 따라오는 괄호를 사용하여 함수를 선언하는 것입니다:
function_name () { echo "This is where your function code goes" }
다른 형식은 함수 이름 앞에 function
키워드를 사용하는 것입니다:
function function_name { echo "This is where your function code goes" }
함수는 스크립트에서 호출되기 전에 선언되어야 합니다. 함수를 호출하는 방법은 일반 명령을 실행하는 것과 같습니다. 함수 이름을 명령어로 사용합니다:
function_name
변수를 사용하여 함수에 데이터 전달하기
Bash에서는 함수가 인수를 사용할 수 없습니다. 함수로 정보를 전달하려면 스크립트에서 전역 변수를 사용해야 합니다.
예를 들어:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then echo "It doesn't seem like I have your name." else echo "Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined
다른 언어에서 사용하는 것과는 다르게 함수 내에서 정의하는 변수는 전역 변수이며 스크립트 외부에 있는 코드에서도 볼 수 있습니다. 함수 내에서 스크립트 외부의 모든 코드에서 접근할 수 없는 지역 변수를 정의하려면local
키워드를 사용하십시오. 예:local i=0
.
함수에서 값을 반환하려면 마찬가지로 전역 변수를 사용해야 합니다. Bash에서 함수는return
키워드를 사용하여 종료 코드만 반환할 수 있습니다. 예제를 살펴보겠습니다:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then MESSAGE="It doesn't seem like I have your name." else MESSAGE="Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined echo $MESSAGE

요약
Bash 스크립팅을 사용하면 UNIX 기반 운영 체제에서 많은 작업을 수행할 수 있습니다. 이 기사에서는 Bash 스크립팅의 기본 개념 중 일부인 스크립트 만들기 및 실행, 문자열 처리, 코드에서 루프 사용에 대해 다뤘습니다. 이러한 내용이 강력한 Bash 스크립트 작성의 출발점이 되기를 희망합니다.
하지만 Bash에 대해 더 많은 것을 배울 수 있습니다. 그 중에는 가장 유용한 명령어, 파일 시스템 탐색 등이 포함됩니다. 다음에 다루어야 할 주제가 있다면 댓글에서 알려주십시오.
관련 기사: