Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

쉘 스크립팅은 리눅스에서 프로세스 자동화를 구현하는 핵심 기술입니다. 스크립팅을 활용하면 여러 명령어를 하나의 파일에 작성해 두고 한 번에 실행할 수 있습니다.

이렇게 하면 같은 명령어를 반복해서 입력하는 수고를 덜 수 있고, 일상적인 작업을 효율적으로 처리하며 심지어 자동 실행까지 예약해 둘 수 있습니다.

또한 특정 스크립트를 시스템 시작 시 실행되도록 설정할 수도 있습니다. 예를 들어 새 세션을 열 때 환영 메시지를 출력하거나 특정 환경 변수를 설정하는 작업 등이 가능합니다.

스크립팅의 활용 분야는 무궁무진합니다. 지금부터 본격적으로 살펴보겠습니다.

이 글에서 배우게 될 내용은 다음과 같습니다:

  1. Bash 셸이란 무엇인가?
  2. Bash 스크립트란 무엇이며 어떻게 식별하는가?
  3. 첫 번째 Bash 스크립트를 만들고 실행하는 방법
  4. 쉘 스크립팅의 기본 문법
  5. 시스템에 예약된 스크립트를 확인하는 방법
  6. 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/bash

bash 프로그램의 경로는 시스템마다 다를 수 있습니다. 경로를 확인하는 방법은 뒤에서 다루겠습니다.

3. 실행 권한

스크립트를 실행하려면 해당 사용자에게 실행 권한이 있어야 합니다.

실행 권한은 x로 표시됩니다. 아래 예시에서 내 사용자 계정은 test_script.sh 파일에 대해 rwx(읽기, 쓰기, 실행) 권한을 가지고 있습니다.

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

4. 파일 색상

실행 가능한 스크립트는 다른 파일이나 폴더와 구분되는 색상으로 표시됩니다.

제 경우에는 실행 권한이 있는 스크립트가 초록색으로 표시됩니다.

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

첫 번째 Bash 스크립트 만들기

이제 화면에 Hello World를 출력하는 간단한 스크립트를 만들어 보겠습니다.

hello_world.sh 파일 생성하기

touch hello_world.sh

Bash 셸 경로 찾기

which bash
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

제 경우 경로는 /usr/bin/bash이며, 이를 shebang에 포함시키겠습니다.

명령어 작성하기

콘솔에 "Hello World"를 출력하기 위해 echo 명령어를 사용합니다.

완성된 스크립트는 다음과 같습니다:

#! /usr/bin/bash
echo "Hello World"

선호하는 텍스트 편집기로 hello_world.sh 파일을 열어 위 내용을 입력하세요.

실행 권한 부여하기

아래 명령어로 파일 권한을 수정하여 스크립트 실행을 허용합니다:

chmod u+x hello_world.sh

chmod는 특정 사용자에 대한 파일의 기존 권한을 수정하는 명령어입니다. 여기서는 사용자(u)에게 실행 권한(+x)을 추가했습니다.

스크립트 실행하기

스크립트는 다음 두 가지 방식으로 실행할 수 있습니다:

./hello_world.sh

bash hello_world.sh

실행 결과는 아래와 같습니다:

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

Bash 스크립팅 기본 문법

다른 프로그래밍 언어와 마찬가지로, Bash 스크립팅 역시 컴퓨터가 이해할 수 있는 프로그램을 만들기 위한 규칙을 따릅니다. 이번 섹션에서는 Bash 스크립팅의 문법을 살펴보겠습니다.

변수 정의하기

variable_name=value 형식으로 변수를 정의할 수 있습니다. 변수의 값을 가져오려면 변수 이름 앞에 $를 붙이면 됩니다.

#!/bin/bash
# 간단한 변수 예제
greeting=Hello
name=Tux
echo $greeting $name
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

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

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

산술 연산식

Bash에서 수학적 계산에 사용할 수 있는 연산자는 다음과 같습니다:

연산자설명
+덧셈
-뺄셈
*곱셈
/나눗셈
**거듭제곱
%나머지(모듈로)

몇 가지 예제를 직접 실행해 보겠습니다.

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

아래 문법을 사용하면 수치 연산 결과를 변수에 저장할 수도 있습니다:

var=$((expression))

예제를 살펴보겠습니다.

#!/bin/bash

var=$((3+9))
echo $var
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

위 방법으로는 소수점 이하 계산이 정확하게 처리되지 않고 잘려나간다는 점에 주의하세요.

소수 계산이 필요하다면 bc 명령어를 사용하여 원하는 소수점 자릿수까지 결과를 얻을 수 있습니다. bc(Bash Calculator)는 명령줄에서 사용할 수 있는 계산기 프로그램으로, 지정한 소수점 자릿수까지 계산을 지원합니다.

echo "scale=2;22/7" | bc

여기서 scale은 출력에 포함할 소수점 자릿수를 지정합니다.

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

사용자 입력 받기

때로는 사용자로부터 입력을 받아 관련 작업을 수행해야 하는 경우가 있습니다.

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
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

숫자 비교 연산자

비교 연산은 조건문이 true(참)인지 false(거짓)인지 판별하는 데 사용됩니다. 두 값을 비교할 때 아래 연산자들을 활용할 수 있습니다:

연산문법설명
같음num1 -eq num2num1이 num2와 같은가?
크거나 같음num1 -ge num2num1이 num2보다 크거나 같은가?
num1 -gt num2num1이 num2보다 큰가?
작거나 같음num1 -le num2num1이 num2보다 작거나 같은가?
작음num1 -lt num2num1이 num2보다 작은가?
같지 않음num1 -ne num2num1이 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

출력 결과:

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

조건문 (의사 결정)

조건은 불리언 값(true 또는 false)으로 평가되는 표현식입니다. 조건을 검사할 때는 if, if-else, if-elif-else, 그리고 중첩 조건문을 사용할 수 있습니다.

조건문의 구조는 다음과 같습니다:

  • if...then...fi
  • if...then...else...fi
  • if..elif..else..fi
  • if..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

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

테스트 케이스 #2

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

테스트 케이스 #3

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

반복문

For 반복문을 사용하면 특정 횟수만큼 문장을 반복 실행할 수 있습니다.

숫자로 반복하기:

아래 예제에서 반복문은 5회 실행됩니다.

#!/bin/bash

for i in {1..5}
do
    echo $i
done
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

문자열로 반복하기:

문자열 목록을 순회하는 것도 가능합니다.

#!/bin/bash

for X in cyan magenta yellow  
do
	echo $X
done
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

While 반복문

While 반복문은 조건을 검사하고, 조건이 true인 동안 계속 반복합니다. 반복 실행을 제어하려면 카운터를 증가시키는 문장이 필요합니다.

아래 예제에서 (( i += 1 ))이 카운터 문장으로, i의 값을 증가시킵니다.

예제:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

파일 읽기

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

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

파일을 한 줄씩 읽어 화면에 출력할 수 있습니다.

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
	do
		echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "sample_file.txt"

출력 결과:

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

역따옴표(back ticks)로 명령어 실행하기

복잡한 명령어의 출력 결과를 스크립트에 포함해야 한다면, 해당 문장을 역따옴표(`)로 감싸면 됩니다.

문법:

var= ` commands `

예제: 이름에 tmpfs가 포함된 마운트 지점 목록의 출력 결과를 얻고 싶다고 가정해 보겠습니다. df -h | grep tmpfs와 같은 명령문을 만들 수 있습니다.

이를 Bash 스크립트에 포함하려면 역따옴표로 감싸면 됩니다.

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

출력 결과:

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

명령줄에서 스크립트 인자 전달받기

스크립트를 실행할 때 인자(argument)를 전달할 수 있습니다.

$@는 1번부터 시작하는 파라미터의 위치를 나타냅니다.

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

다음과 같이 실행합니다:

./script arg1 arg2

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

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 명령어는 특정 사용자에게 이미 예약된 스크립트 목록을 보여줍니다.

초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

find 명령어 사용하기

find 명령어는 특정 패턴에 맞는 파일을 검색하는 데 유용합니다. 대부분의 스크립트가 .sh로 끝나므로, 아래와 같이 find 명령어를 활용할 수 있습니다:

find . -type f -name "*.sh"

각 옵션의 의미는 다음과 같습니다:

  • . : 현재 디렉터리를 의미합니다. 필요에 따라 경로를 변경할 수 있습니다.
  • -type f : 찾으려는 파일 유형이 일반 텍스트 파일임을 나타냅니다.
  • *.sh : .sh로 끝나는 모든 파일과 일치시킵니다.
초보자를 위한 쉘 스크립팅 완벽 가이드 – 리눅스에서 Bash 스크립트 작성하는 방법

find 명령어에 대해 더 자세히 알고 싶다면 제 다른 글을 확인해 주세요.

마무리

이 튜토리얼에서는 쉘 스크립팅의 기본기를 배웠습니다. 의미 있는 프로그램을 작성하는 데 도움이 되는 다양한 예제와 문법을 살펴보았습니다.

이 튜토리얼에서 가장 유익했던 내용은 무엇인가요? Twitter로 의견을 공유해 주세요!

제 다른 글들도 여기서 확인하실 수 있습니다.

Work vector created by macrovector - www.freepik.com