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

리눅스 셸 스크립트 작성 방법 완벽 가이드 – 기초부터 실전 예제까지

셸 스크립트 작성은 모든 리눅스 사용자가 반드시 익혀야 할 핵심 기술 중 하나입니다. 셸 스크립트를 활용하면 한 줄씩 일일이 입력해야 하는 번거로운 반복 작업을 자동화할 수 있어 업무 효율이 크게 향상됩니다.

이 글에서는 모든 리눅스 사용자가 알아두면 좋은 기본적인 셸 스크립팅 기법을 예제와 함께 단계별로 살펴봅니다.

1. 간단한 셸 스크립트 만들기

셸 스크립트는 ASCII 텍스트로 구성된 파일입니다. 텍스트 편집기를 사용하면 손쉽게 작성할 수 있으며, 명령줄 기반 편집기와 GUI 기반 편집기 모두 활용 가능합니다. 이 가이드에서는 vim 편집기를 사용합니다.

먼저 실행했을 때 “Hello world”를 출력하는 간단한 스크립트를 만들어 보겠습니다.

$ vim hello.sh

파일에 아래 내용을 입력한 뒤 저장합니다.

#!/bin/bash
# Print Hello world message
echo "Hello World!"

이제 스크립트를 한 줄씩 살펴보겠습니다.

  • 첫 번째 줄#!/bin/bash셔뱅(shebang)이라고 부르는 특수한 선언부입니다. 이 스크립트를 어떤 프로그램으로 해석할지 지정하는 역할을 하며, 여기서는 /bin/bash에 해당하는 bash 셸을 사용한다는 의미입니다. 다른 언어도 마찬가지 방식으로 지정할 수 있습니다. 예를 들어 Python#!/usr/bin/python3, Perl#!/usr/bin/perl을 사용합니다.
  • 두 번째 줄은 주석입니다. 주석은 스크립트의 동작을 설명하는 문장으로, 실행 시에는 무시됩니다. 주석은 항상 해시 기호 #로 시작합니다.
  • 마지막 줄은 터미널에 ‘Hello World’ 메시지를 출력하는 실제 명령어입니다.

다음으로 chmod 명령어로 실행 권한을 부여하여 스크립트를 실행 가능한 상태로 만듭니다.

$ chmod +x hello.sh

마지막으로 아래 명령어 중 하나를 사용해 스크립트를 실행합니다.

$ bash hello.sh
OR
$ ./hello.sh

2. 조건문으로 코드 실행 제어하기

다른 프로그래밍 언어와 마찬가지로 bash 스크립팅에서도 조건문을 사용해 의사결정을 수행합니다. 문법은 약간의 차이만 있을 뿐 개념은 동일합니다. 여기서는 if, if-else, elif 세 가지 조건문을 다룹니다.

if문 기본 예제

if문은 하나 또는 여러 개의 조건을 검사할 때 사용합니다. 먼저 단일 조건을 검사하는 가장 기본적인 형태부터 살펴보겠습니다. if문은 if ... fi 블록으로 정의됩니다.

if command
then
  statement
fi

아래 스크립트를 확인해 보겠습니다.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

이 스크립트는 사용자에게 점수를 입력받아 변수 x에 저장합니다. 입력된 점수가 70과 같으면 “Good job!”이라는 결과를 출력합니다. 비교 연산자 ==는 변수 x에 저장된 값이 70과 같은지 검사하는 데 사용됩니다.

그 외에 사용할 수 있는 비교 연산자는 다음과 같습니다.

  • -eq – 같음(Equal to)
  • -ne – 같지 않음(Not equal to)
  • -lt – 미만(Less than)
  • -le – 이하(Less than or equal to)
  • -gt – 초과(Greater than)
  • -ge – 이상(Greater than or equal to)

예를 들어 아래 if문 블록은 입력된 점수가 50 미만일 경우 ‘Work Harder’를 출력합니다.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

if-else문 예제

결과가 두 가지로 나뉘는 상황, 즉 ‘이것 아니면 저것’처럼 선택지가 둘뿐이라면 if-else문이 유용합니다.

if command
then
  statement1
else
  statement2
fi

아래 스크립트는 점수를 입력받아 70 이상인지 검사합니다.

점수가 70 이상이면 ‘Great job, You passed!’ 메시지가 출력되고, 70 미만이면 ‘You failed’가 출력됩니다.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo 'You failed'
fi

if-elif-else문 예제

조건이 여러 개이고 그에 따른 결과도 다양한 경우에는 if-elif-else문을 사용합니다. 기본 형식은 다음과 같습니다.

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

예를 들어 입력된 숫자가 90, 60, 30 중 하나인지 확인하는 복권 추첨 스크립트를 만들어 보겠습니다.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]]; then
  echo "You have won the First Prize"
elif [[ $x -eq 60 ]]; then
  echo "You have won the Second Prize"
elif [[ $x -eq 30 ]]; then
  echo "You have won the Third Prize"
else
  echo "Please try again"
fi

3. AND 논리 연산자와 함께 if문 사용하기

if문에 AND 논리 연산자를 결합하면 두 조건이 모두 충족될 때만 특정 작업을 실행하도록 만들 수 있습니다. AND 논리는 && 연산자로 표현합니다.

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == "tecmint" && $tag_id -eq 3990) ]]; then
  echo "Login successful"
else
  echo "Login failure"
fi

4. OR 논리 연산자와 함께 if문 사용하기

OR 논리는 || 기호로 표현되며, 두 조건 중 하나만 충족되어도 스크립트가 의도한 결과를 출력합니다.

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ ($number -eq 55 || $number -eq 80) ]]; then
  echo 'Congratulations! You've won'
else
  echo 'Sorry, try again'
fi

5. 반복문(Loop) 활용하기

Bash 반복문을 사용하면 원하는 결과가 나올 때까지 일련의 작업을 계속 수행할 수 있습니다. 반복 작업을 처리할 때 특히 유용하며, 다른 프로그래밍 언어에서도 흔히 볼 수 있는 while문과 for문을 지원합니다.

while 반복문

while문은 가장 다루기 쉬운 반복문 중 하나로, 문법도 매우 간단합니다.

while <some test>
do
 commands
done

아래 while문은 실행 시 1부터 10까지의 모든 숫자를 출력합니다.

#!/bin/bash
# A simple while loop
counter=1
while [ $counter -le 10 ]
do
echo $counter
((counter++))
done

while문의 동작을 자세히 살펴보겠습니다. 변수 counter1로 초기화되며, 값이 10 이하인 동안 조건이 충족될 때까지 counter 값을 계속 증가시킵니다. echo $counter 줄이 1부터 10까지의 숫자를 모두 출력합니다.

for 반복문

while문과 마찬가지로 for 반복문도 코드를 반복 실행할 때 사용합니다. 즉, 사용자가 정의한 횟수만큼 코드 실행을 반복하는 것입니다.

기본 문법은 다음과 같습니다.

for var in 1 2 3 4 5 N
do
 command1
 command2
done

아래 for 반복문은 1부터 10까지 차례대로 반복하며 각 값을 화면에 출력합니다.

모든 숫자를 직접 나열하는 대신, 이중 중괄호 { }로 범위를 지정하면 더욱 간결하게 작성할 수 있습니다.

#!/bin/bash
# Specify range in a for loop

for num in {1..10}
do
  echo $num
done

6. Bash 위치 매개변수(Positional Parameters)

위치 매개변수는 스크립트 실행 시 셸에 전달된 값을 참조하는 특수 변수로, 스크립트 내부에서 직접 값을 할당할 수 없습니다. 위치 매개변수는 $0, $1, $2, $3 …부터 $9까지 사용할 수 있으며, $9를 넘어서는 값은 ${10}, ${11} …처럼 중괄호로 묶어야 합니다.

스크립트를 실행하면 첫 번째 위치 매개변수인 $0에는 셸 스크립트의 이름이 담깁니다. $1에는 전달된 첫 번째 인수, $2에는 두 번째 인수, $3에는 세 번째 인수가 순서대로 저장됩니다.

다음과 같이 test.sh 스크립트를 만들어 보겠습니다.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

이제 이름과 성을 인수로 전달하며 스크립트를 실행합니다.

# bash test.sh James Kiarie

출력 결과를 보면 첫 번째로 출력된 값은 셸 스크립트의 이름, 즉 test.sh입니다. 그다음으로 스크립트에 정의된 위치 매개변수에 해당하는 이름들이 차례로 출력됩니다.

위치 매개변수를 활용하면 변수에 값을 직접 할당하지 않고도 입력 데이터를 유연하게 커스터마이징할 수 있다는 장점이 있습니다.

7. 셸 명령어 종료 코드(Exit Codes)

먼저 간단한 질문부터 시작하겠습니다. 종료 코드(exit code)란 무엇일까요?

사용자나 셸 스크립트가 셸에서 실행하는 모든 명령어에는 종료 상태(exit status)가 존재하며, 이는 정수 값입니다.

종료 상태가 0이면 명령어가 오류 없이 성공적으로 실행되었음을 의미합니다. 반면 1~255 사이의 값은 명령어가 실패했거나 정상적으로 실행되지 않았음을 나타냅니다.

명령어의 종료 상태를 확인하려면 $? 셸 변수를 사용합니다.

  • 종료 코드 1: 일반적인 오류 또는 허용되지 않는 작업 발생. 예를 들어 sudo 권한 없이 파일을 수정하려는 경우 등이 해당합니다.
  • 종료 코드 2: 명령어나 셸 내장 변수를 잘못된 방식으로 사용한 경우.
  • 종료 코드 127: 유효하지 않은 명령어를 실행한 경우로, 보통 ‘command not found’ 오류가 발생합니다.

8. 스크립트 내에서 셸 명령어 출력 처리하기

Bash 스크립팅에서는 명령어의 출력 결과를 변수에 저장해 이후에 재사용할 수 있습니다. 이를 명령어 치환(command substitution)이라고 하며, 다음과 같은 방식으로 구현합니다.

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

예를 들어 date 명령어의 결과를 today라는 변수에 저장하고, 셸 스크립트를 호출해 현재 날짜를 출력할 수 있습니다.

#!/bin/bash

today=$(date)

echo "Today is $today"

또 다른 예제를 살펴보겠습니다. 리눅스 시스템에서 로그인 가능한 사용자 목록을 찾으려면 어떻게 해야 할까요? 먼저 모든 사용자(시스템 사용자, 프로세스 사용자, 로그인 사용자 포함)의 목록은 /etc/passwd 파일에 저장되어 있습니다.

파일을 열람하려면 cat 명령어를 사용해야 합니다. 여기서 로그인 사용자만 골라내려면 grep 명령어로 /bin/bash 속성을 가진 사용자를 검색한 뒤, cut -c 1-10 명령어로 이름의 처음 10글자만 표시하면 됩니다.

아래 예제에서는 cat 명령어의 결과를 login_users 변수에 저장했습니다.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:'
echo $login_users

지금까지 간단한 셸 스크립트를 만드는 방법에 대한 튜토리얼을 마무리하겠습니다. 이 글이 여러분의 리눅스 학습에 도움이 되기를 바랍니다.