리눅스 - 배시 쉘 스크립트 기본 문법

코린이·2024년 12월 3일

Linux

목록 보기
27/27

📌 변수 선언

변수 선언 시 = 기호 앞/뒤에는 공백이 없어야 한다.

변수를 사용할 때는 $ 기호 또는 ${}를 사용하며, 변수를 사용할 때는 큰 따옴표" 사이에 사용되는 것이 안전하다. 따옴표 없이 변수만 사용할 때는 공백이나 비어 있는 값으로 인해 문제가 발생할 수 있다.

#!/bin/bash

# 변수 선언
name="Kim"

# 출력
echo "hello $name."
echo "hello ${name}."

📌 조건문

if 조건문은 아래와 같은 문법을 지켜야 한다.

  • if 문의 시작은 if, 종료는 fi를 작성해야 한다.
  • 조건식은 대괄호[] 안에 작성해야 하며, 조건식 앞/뒤에 공백이 있어야 한다. 또한 조건식이 종료되면 세미콜론 ;으로 조건식을 종료하거나, 줄 바꿈을 해야 한다.
  • 조건식 이후 then을 작성하여 다음 명령문을 작성할 수 있다.
  • 추가 조건식은 elif를 사용하며, 그 외 조건은 else를 사용한다.
  • &&(and)연산자와 ||(or) 연산자를 사용하여 조건식을 결합할 수 있다.

if문 기본 문법

#!/bin/bash
if [ 조건식1 ]; then 
	명령문
elif [ 조건식2 ]; then
	명령문
elif [ 조건식3 ] && [ 조건식4 ]; then
	명령문
else
	명령문
fi	

배시 쉘 스크립트에서는 일반적으로 사용하는 부등호(<, > 등)을 사용할 수 없다. 리눅스에서 부등호는 이미 파일 리다이렉션(File Redirection)을 위한 기호로 사용되기 때문이다.

문자를 비교할 때는 부등호를 사용하여 사전적 순서를 비교할 수 있다. [["apple" < "banana"]]

하지만, 숫자를 비교할 때는 부등호를 사용할 수 없으며, 별도의 비교 연산자를 사용해야 한다.

문자열 비교

=   : 두 문자열이 같은지 확인
==  : 두 문자열이 같은지 확인 (=와 동일한 기능)
!=  : 두 문자열이 다른지 확인
-z  : 문자열이 null인지 확인, null이면 true
-n  : 문자열이 null이 아닌지 확인

숫자 비교

=    : 두 숫자가 같은지 확인 (추천X)
-eq  : 두 숫자가 같은지 확인  (n = m)
-ne  : 두 숫자가 다른지 확인  (n != m)
-gt  : 한 숫자가 다른 숫자보다 큰지 확인 (n > m)
-ge  : 한 숫자가 다른 숫자보다 크거나 같은지 확인 (n >= m)
-lt  : 한 숫자가 다른 숫자보다 작은지 확인 (n < m)
-le  : 한 숫자가 다른 숫자보다 작거나 같은지 확인 (n <= m)

두 숫자가 같은지 비교하는 연산자는 =-eq가 있다. Bash에서는 비교 대상이 숫자일 경우 =를 숫자 비교로 자동 변환할 수 있지만, 명확한 코드 작성을 위해 -eq를 사용하는 것이 좋다.

예시

#!/bin/bash

n=10

if [ "$n" -gt 20 ]; then
	echo "20 보다 크다."
elif [ "$n" -lt 20 ]; then
	echo "20 보다 작다."
elif [ "$n" -eq 20 ]; then
	echo "20이 맞다."
else
	echo "모르겠다."
fi

숫자, 문자 외에도 파일 확인 연산자도 존재한다.

-f : 지정한 파일이 존재하고, 일반 파일인지 확인
-d : 지정한 디렉토리가 존재하는지 확인
-s : 지정한 파일이 존재하고, 비어 있지 않은지 확인
-r : 지정한 파일이 존재하고, 읽을 수 있는지 확인
-w : 지정한 파일이 존재하고, 수정할 수 있는지 확인
-x : 지정한 파일이 존재하고, 실행할 수 있는지 확인

📌 반복문(for)

for 반복문은 아래와 같은 문법을 지켜야 한다.

  • for 문의 시작은 for, 종료는 done를 작성해야 한다.
  • 반복 범위 설정은 중괄호 {}안에 작성해야 하며, ..을 작성하여 범위를 지정한다.
  • 범위 외에도 문자열, 숫자 나열, 배열 등의 요소도 반복문에 사용할 수 있다.
  • 반복 범위를 지정한 후 세미콜론 ;으로 범위 지정을 종료하거나, 줄 바꿈을 해야 한다.
  • do를 작성하여 다음 실행 명령문을 작성할 수 있다.

반복 범위 지정

#!/bin/bash

for i in {1..5}; do
	echo "번호: $i"
done

----출력----
번호: 1
번호: 2
번호: 3
번호: 4
번호: 5

숫자/문자 나열

#!/bin/bash

for i in "하나" 2 "셋" 4 "다섯"; do
	echo "번호: $i"
done

----출력----
번호: 하나
번호: 2
번호: 셋
번호: 4
번호: 다섯

배열 순회

#!/bin/bash

arr=("apple" "orange" "banana" "melon")

for i in "${arr[@]}"; do
	echo "fruit: $i"
done

----출력----
과일: apple
과일: orange
과일: banana
과일: melon

📌 반복문(while)

while 반복문은 아래와 같은 문법을 지켜야 한다.

  • while 문의 시작은 'while', 종료는 'done'를 작성해야 한다.
  • 대괄호 [] 안에 조건식을 작성하여 범위를 지정한다.
  • 조건식을 지정한 후 세미콜론 ;으로 범위 지정을 종료하거나, 줄 바꿈을 해야 한다.
  • do를 작성하여 다음 실행 명령문을 작성할 수 있다.
  • 수학적 계산식을 작성할 때는 이중 괄호 (()) 안에 식을 작성한다.

✅ 수학적 계산식

쉘 스크립트에서 수학적 계산식은 이중 괄호 ((계산식))에 작성해야 한다.

괄호 없이 계산식을 작성할 경우, 해당 식을 명령문으로 인식하기 때문에 동작하지 않는다.

일반 괄호 ()안에 작성할 때도 계산식으로 인식하지 않는다. 쉘 스크립트에서 일반 괄호는 서브 쉘, 배열 등에 사용되기 때문이다.

#!/bin/bash

n=1

while [ "$n" -lt 5 ]; do
        echo "번호: $n"
        ((n++)) #수학적 계산식
done


---- 출력 ----
번호: 1
번호: 2
번호: 3
번호: 4

📌 함수

배시 쉘 스크립트에서 함수는 다음과 같은 문법과 특징을 가지고 있다.

  • function 키워드를 사용하여 함수를 정의할 수 있지만, 일반적으로 해당 키워드 사용 없이 함수명 뒤에 괄호()를 사용하여 함수를 정의하는 게 일반적이다.
  • 함수를 정의할 때 별도의 매개변수(Parameter) 정의 없이 함수 내부에 $1 ~ $n을 작성하여 사용한다.
  • 정수, 음수, 소수, 문자열 등 값을 반환할 때는 echo 또는 printf를 사용하여 반환해야 한다. 쉘 스크립트에서 return은 상태 코드(Exit Status)를 반환한다.
  • 함수에 인수 값(Argument)을 전달할 때 별도의 괄호() 사용 없이 사용된다. 함수명 작성 후 공백으로 인수 값을 작성한다.
  • 함수 내 지역 변수를 정의할 때는 local 키워드를 사용하여 변수를 사용한다. local 키워드를 사용하면 함수 외부에서 해당 변수에 접근할 수 없다.

함수 기본 문법

함수명() {
	# 명령문
}

함수명  # 함수 호출

매개변수 및 인수 활용

함수 내부에 사용할 매개변수 $1 ~ $n을 작성하여 사용
함수 호출 시 인수는 함수명 작성 후 인수 값을 작성. 각 인수는 공백으로 구분.

#!/bin/bash

fnIntroduce(){
	echo "내 이름은 $1이고, 나이는 $2살이야"
}

fnIntroduce "김철수" 5


---- 출력 -----
내 이름은 김철수이고, 나이는 5살이야

함수 기본값 설정

기본값을 설정할 때는 지정할 인수 번호에 맞게 n:-<기본값>을 정의해야 한다.

#!/bin/bash

fnIntroduce(){
        local defaultAge=${2:-100}

        echo "내 이름은 ${1:-"김아무개"}이고, 나이는 $defaultAge살이야"
}

fnIntroduce


---- 출력 ----
내 이름은 김아무개이고, 나이는 100살이야

팩토리얼 함수

#!/bin/bash

fnFactorial(){
        local result=1

        for i in $(seq 1 $1); do
                result=$((result * i))
        done

        echo $result
}

fnFactorial 5


---- 출력 ----
120

📌 에러 핸들링

배시 쉘 스크립트에서는 에러 핸들링을 통해 스크립트 실행 중 발생하는 오류를 처리하고, 필요한 조치를 취할 수 있다.

✅ 에러 발생 시 스크립트 종료

배시 쉘 스크립트에서 set -e을 선언하면, 선언 위치를 기준으로 하단부에 에러 발생 시 스크립트가 종료된다.

#!/bin/bash

set -e  # 에러가 발생하면 스크립트 종료

echo "Start" # 실행
ls null_file.txt  # 존재하지 않는 파일 출력 시도 -> 에러 발생 -> 에러 문구 출력
echo "End"   # 실행X

✅ 에러 코드 확인

배시 쉘 스크립트에서 마지막으로 실행된 명령어의 종료 상태 코드는 특수 변수 $?에 저장된다.

  • 상태 코드값이 0 : 명령어 실행 성공
  • 상태 코드값이 0 외 숫자 : 명령어 실행 실패(에러 발생)
#!/bin/bash

file="null_file.txt"

ls $file 2>/dev/null  # 표준 에러(2) 출력 날림(/dev/null). 즉, 에러 출력X

if [ $? -ne 0 ]; then
        echo "에러 발생 파일이 없음!!"
else
        echo "파일 존재!!"
fi

echo "스크립트 종료"  # 실행

✅ 에러 코드 지정 및 스크립트 종료

배시 쉘 스크립트에서 exit 명령어를 사용하여 종료 코드(exit code)를 지정하고, 명시적으로 스크립트를 종료할 수 있다.

exit 명령어 뒤에 정수 값을 지정하여 종료 상태 코드를 설정.

#!/bin/bash

name="김철수"

if [ ! $name == "신짱구" ]; then
        echo "에러발생 : 신짱구가 아닙니다!!"
        exit 1  # 종료 코드 지정 후 스크립트 종료
fi

echo "김철수입니다."  # 실행X

0개의 댓글