쉘 스크립팅은 리눅스에서 프로세스 자동화를 구현하는 핵심 기술입니다. 스크립팅을 활용하면 여러 명령어를 하나의 파일에 작성해 두고 한 번에 실행할 수 있습니다.
이렇게 하면 같은 명령어를 반복해서 입력하는 수고를 덜 수 있고, 일상적인 작업을 효율적으로 처리하며 심지어 자동 실행까지 예약해 둘 수 있습니다.
또한 특정 스크립트를 시스템 시작 시 실행되도록 설정할 수도 있습니다. 예를 들어 새 세션을 열 때 환영 메시지를 출력하거나 특정 환경 변수를 설정하는 작업 등이 가능합니다.
스크립팅의 활용 분야는 무궁무진합니다. 지금부터 본격적으로 살펴보겠습니다.
이 글에서 배우게 될 내용은 다음과 같습니다:
- Bash 셸이란 무엇인가?
- Bash 스크립트란 무엇이며 어떻게 식별하는가?
- 첫 번째 Bash 스크립트를 만들고 실행하는 방법
- 쉘 스크립팅의 기본 문법
- 시스템에 예약된 스크립트를 확인하는 방법
- cron 작업을 통해 스크립트를 자동화하는 방법
배우는 가장 좋은 방법은 직접 실습하는 것입니다. Replit을 이용하면 몇 분 만에 실행 중인 리눅스 셸 환경에 접속할 수 있으니 따라 해 보시길 적극 권장합니다.
Bash 셸 소개
리눅스 명령줄은 '셸(shell)'이라는 프로그램이 제공합니다. 오랜 시간 동안 셸 프로그램은 다양한 옵션을 지원하도록 발전해 왔습니다.
사용자마다 서로 다른 셸을 사용하도록 설정할 수 있지만, 대부분의 사용자는 기본 셸을 그대로 사용하는 것을 선호합니다. 많은 리눅스 배포판의 기본 셸은 GNU Bourne-Again Shell, 즉 bash입니다. Bash는 Bourne 셸(sh)의 후속 버전입니다.
셸을 처음 실행하면 .bashrc 또는 .bash_profile 파일에 위치한 시작 스크립트를 읽어 들이며, 이를 통해 셸의 동작 방식을 사용자 입맛대로 커스터마이징할 수 있습니다.
셸이 대화형 모드로 실행되면 사용자의 명령 입력을 기다리는 동안 $ 기호를 표시합니다. 이것을 '셸 프롬프트'라고 부릅니다.
[username@host ~]$만약 셸이 root(루트) 권한으로 실행 중이라면 프롬프트는 #로 바뀝니다. 슈퍼유저 셸 프롬프트는 아래와 같습니다:
[root@host ~]#Bash는 GUI로는 효율적으로 처리하기 어려운 작업들을 간단하게 수행할 수 있는 강력한 도구입니다. 참고로 대부분의 서버에는 GUI가 없으므로, 명령줄 인터페이스(CLI)를 능숙하게 다루는 법을 익혀 두는 것이 매우 유용합니다.
Bash 스크립트란?
Bash 스크립트란 하나의 파일에 작성된 일련의 명령어 모음입니다. bash 프로그램이 이 파일을 읽어 한 줄씩 순서대로 실행합니다.
예를 들어, 명령줄에서 특정 경로로 이동한 뒤 폴더를 생성하고 그 안에서 프로세스를 실행하는 작업을 할 수 있습니다.
동일한 작업 흐름을 명령어들을 Bash 스크립트 파일에 저장해 두면, 필요할 때마다 몇 번이고 반복해서 실행할 수 있습니다.
Bash 스크립트를 식별하는 방법
1. .sh 확장자
관례상 Bash 스크립트는 .sh 확장자로 끝납니다. 다만 .sh 확장자가 없어도 스크립트는 정상적으로 실행됩니다.
2. Shebang(#!)으로 시작
스크립트는 shebang으로도 식별됩니다. Shebang은 #(bash)과 !(bang)의 조합 뒤에 bash 셸 경로가 붙는 형태로, 스크립트의 첫 번째 줄에 위치합니다. Shebang은 해당 스크립트를 bash 셸로 실행하라고 알려주는 역할을 하며, 단순히 bash 인터프리터의 절대 경로를 나타냅니다.
Shebang 선언문의 예시는 아래와 같습니다.
#! /bin/bashbash 프로그램의 경로는 시스템마다 다를 수 있습니다. 경로를 확인하는 방법은 뒤에서 다루겠습니다.
3. 실행 권한
스크립트를 실행하려면 해당 사용자에게 실행 권한이 있어야 합니다.
실행 권한은 x로 표시됩니다. 아래 예시에서 내 사용자 계정은 test_script.sh 파일에 대해 rwx(읽기, 쓰기, 실행) 권한을 가지고 있습니다.

4. 파일 색상
실행 가능한 스크립트는 다른 파일이나 폴더와 구분되는 색상으로 표시됩니다.
제 경우에는 실행 권한이 있는 스크립트가 초록색으로 표시됩니다.

첫 번째 Bash 스크립트 만들기
이제 화면에 Hello World를 출력하는 간단한 스크립트를 만들어 보겠습니다.
hello_world.sh 파일 생성하기
touch hello_world.shBash 셸 경로 찾기
which bash
제 경우 경로는 /usr/bin/bash이며, 이를 shebang에 포함시키겠습니다.
명령어 작성하기
콘솔에 "Hello World"를 출력하기 위해 echo 명령어를 사용합니다.
완성된 스크립트는 다음과 같습니다:
#! /usr/bin/bash
echo "Hello World"선호하는 텍스트 편집기로 hello_world.sh 파일을 열어 위 내용을 입력하세요.
실행 권한 부여하기
아래 명령어로 파일 권한을 수정하여 스크립트 실행을 허용합니다:
chmod u+x hello_world.shchmod는 특정 사용자에 대한 파일의 기존 권한을 수정하는 명령어입니다. 여기서는 사용자(u)에게 실행 권한(+x)을 추가했습니다.
스크립트 실행하기
스크립트는 다음 두 가지 방식으로 실행할 수 있습니다:
./hello_world.sh
bash hello_world.sh
실행 결과는 아래와 같습니다:

Bash 스크립팅 기본 문법
다른 프로그래밍 언어와 마찬가지로, Bash 스크립팅 역시 컴퓨터가 이해할 수 있는 프로그램을 만들기 위한 규칙을 따릅니다. 이번 섹션에서는 Bash 스크립팅의 문법을 살펴보겠습니다.
변수 정의하기
variable_name=value 형식으로 변수를 정의할 수 있습니다. 변수의 값을 가져오려면 변수 이름 앞에 $를 붙이면 됩니다.
#!/bin/bash
# 간단한 변수 예제
greeting=Hello
name=Tux
echo $greeting $name

참고로 Tux는 리눅스 마스코트인 펭귄의 이름이기도 합니다.

산술 연산식
Bash에서 수학적 계산에 사용할 수 있는 연산자는 다음과 같습니다:
| 연산자 | 설명 |
|---|---|
| + | 덧셈 |
| - | 뺄셈 |
| * | 곱셈 |
| / | 나눗셈 |
| ** | 거듭제곱 |
| % | 나머지(모듈로) |
몇 가지 예제를 직접 실행해 보겠습니다.

아래 문법을 사용하면 수치 연산 결과를 변수에 저장할 수도 있습니다:
var=$((expression))
예제를 살펴보겠습니다.
#!/bin/bash
var=$((3+9))
echo $var

위 방법으로는 소수점 이하 계산이 정확하게 처리되지 않고 잘려나간다는 점에 주의하세요.
소수 계산이 필요하다면 bc 명령어를 사용하여 원하는 소수점 자릿수까지 결과를 얻을 수 있습니다. bc(Bash Calculator)는 명령줄에서 사용할 수 있는 계산기 프로그램으로, 지정한 소수점 자릿수까지 계산을 지원합니다.
echo "scale=2;22/7" | bc
여기서 scale은 출력에 포함할 소수점 자릿수를 지정합니다.

사용자 입력 받기
때로는 사용자로부터 입력을 받아 관련 작업을 수행해야 하는 경우가 있습니다.
Bash에서는 read 명령어로 사용자 입력을 받을 수 있습니다.
read variable_name사용자에게 안내 메시지를 함께 표시하려면 -p 옵션을 사용하세요.
read -p "Enter your age" variable_name
예제:
#!/bin/bash
echo "Enter a number"
read a
echo "Enter a number"
read b
var=$((a+b))
echo $var

숫자 비교 연산자
비교 연산은 조건문이 true(참)인지 false(거짓)인지 판별하는 데 사용됩니다. 두 값을 비교할 때 아래 연산자들을 활용할 수 있습니다:
| 연산 | 문법 | 설명 |
|---|---|---|
| 같음 | num1 -eq num2 | num1이 num2와 같은가? |
| 크거나 같음 | num1 -ge num2 | num1이 num2보다 크거나 같은가? |
| 큼 | num1 -gt num2 | num1이 num2보다 큰가? |
| 작거나 같음 | num1 -le num2 | num1이 num2보다 작거나 같은가? |
| 작음 | num1 -lt num2 | num1이 num2보다 작은가? |
| 같지 않음 | num1 -ne num2 | num1이 num2와 같지 않은가? |
문법:
if [ conditions ]
then
commands
fi예제:
두 숫자를 비교하여 관계를 판별해 보겠습니다:
read x
read y
if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi
출력 결과:

조건문 (의사 결정)
조건은 불리언 값(true 또는 false)으로 평가되는 표현식입니다. 조건을 검사할 때는 if, if-else, if-elif-else, 그리고 중첩 조건문을 사용할 수 있습니다.
조건문의 구조는 다음과 같습니다:
if...then...fi문if...then...else...fi문if..elif..else..fiif..then..else..if..then..fi..fi..(중첩 조건문)
문법:
if [[ condition ]]
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi더 의미 있는 비교를 위해 AND(-a)와 OR(-o) 연산자도 함께 사용할 수 있습니다.
아래 조건문은 "a가 40보다 크고 b가 6보다 작으면"이라는 의미입니다.
if [ $a -gt 40 -a $b -lt 6 ]
예제: 삼각형의 세 변의 길이를 입력받아 삼각형의 종류를 판별해 보겠습니다.
read a
read b
read c
if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL
elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELES
else
echo SCALENE
fi출력 결과:
테스트 케이스 #1

테스트 케이스 #2

테스트 케이스 #3

반복문
For 반복문을 사용하면 특정 횟수만큼 문장을 반복 실행할 수 있습니다.
숫자로 반복하기:
아래 예제에서 반복문은 5회 실행됩니다.
#!/bin/bash
for i in {1..5}
do
echo $i
done
문자열로 반복하기:
문자열 목록을 순회하는 것도 가능합니다.
#!/bin/bash
for X in cyan magenta yellow
do
echo $X
done
While 반복문
While 반복문은 조건을 검사하고, 조건이 true인 동안 계속 반복합니다. 반복 실행을 제어하려면 카운터를 증가시키는 문장이 필요합니다.
아래 예제에서 (( i += 1 ))이 카운터 문장으로, i의 값을 증가시킵니다.
예제:
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done

파일 읽기
아래와 같은 sample_file.txt 파일이 있다고 가정해 보겠습니다:

파일을 한 줄씩 읽어 화면에 출력할 수 있습니다.
#!/bin/bash
LINE=1
while read -r CURRENT_LINE
do
echo "$LINE: $CURRENT_LINE"
((LINE++))
done < "sample_file.txt"출력 결과:

역따옴표(back ticks)로 명령어 실행하기
복잡한 명령어의 출력 결과를 스크립트에 포함해야 한다면, 해당 문장을 역따옴표(`)로 감싸면 됩니다.
문법:
var= ` commands `
예제: 이름에 tmpfs가 포함된 마운트 지점 목록의 출력 결과를 얻고 싶다고 가정해 보겠습니다. df -h | grep tmpfs와 같은 명령문을 만들 수 있습니다.
이를 Bash 스크립트에 포함하려면 역따옴표로 감싸면 됩니다.
#!/bin/bash
var=`df -h | grep tmpfs`
echo $var출력 결과:

명령줄에서 스크립트 인자 전달받기
스크립트를 실행할 때 인자(argument)를 전달할 수 있습니다.
$@는 1번부터 시작하는 파라미터의 위치를 나타냅니다.
#!/bin/bash
for x in $@
do
echo "Entered arg is $x"
done다음과 같이 실행합니다:
./script arg1 arg2

cron 작업으로 스크립트 자동화하기
Cron은 Unix 계열 시스템에 내장된 작업 스케줄링 유틸리티입니다. 매일, 매주, 매월 또는 하루 중 특정 시간에 작업이 실행되도록 예약할 수 있습니다. 리눅스의 자동화는 cron 작업에 크게 의존하고 있습니다.
cron을 예약하는 문법은 아래와 같습니다:
# Cron job example
* * * * * sh /path/to/script.sh여기서 *는 각각 분(minute), 시(hour), 일(day), 월(month), 요일(weekday)을 나타냅니다.
cron 작업 예약의 몇 가지 예시는 다음과 같습니다.
| 스케줄 | 예약 내용 |
|---|---|
| 5 0 * 8 * | 8월 매일 새벽 00:05에 실행 |
| 5 4 * * 6 | 매주 일요일 04:05에 실행 |
| 0 22 * * 1-5 | 월요일부터 금요일까지 매일 22:00에 실행 |
cron에 대해 더 자세히 알고 싶다면 관련 블로그 포스트를 참고하세요.
시스템의 기존 스크립트 확인하기
crontab 사용하기
crontab -l 명령어는 특정 사용자에게 이미 예약된 스크립트 목록을 보여줍니다.

find 명령어 사용하기
find 명령어는 특정 패턴에 맞는 파일을 검색하는 데 유용합니다. 대부분의 스크립트가 .sh로 끝나므로, 아래와 같이 find 명령어를 활용할 수 있습니다:
find . -type f -name "*.sh"각 옵션의 의미는 다음과 같습니다:
.: 현재 디렉터리를 의미합니다. 필요에 따라 경로를 변경할 수 있습니다.-type f: 찾으려는 파일 유형이 일반 텍스트 파일임을 나타냅니다.*.sh:.sh로 끝나는 모든 파일과 일치시킵니다.

find 명령어에 대해 더 자세히 알고 싶다면 제 다른 글을 확인해 주세요.
마무리
이 튜토리얼에서는 쉘 스크립팅의 기본기를 배웠습니다. 의미 있는 프로그램을 작성하는 데 도움이 되는 다양한 예제와 문법을 살펴보았습니다.
이 튜토리얼에서 가장 유익했던 내용은 무엇인가요? Twitter로 의견을 공유해 주세요!
제 다른 글들도 여기서 확인하실 수 있습니다.
Work vector created by macrovector - www.freepik.com