본문 바로가기
Linux/Linux 명령어, 스크립트, 설정

리눅스에서 자주 사용하는 스크립트 사용법 총정리

by Developer88 2025. 1. 14.
반응형

오늘은 리눅스에서 자주 사용하는 스크립트 문법에 대해서,

총정리해 보겠습니다.

 

1. Bash shell 사용선언

스크립트의 가장 첫 줄에는 아래와 같은 코드로,

어떤 shell을 사용할지 선언해주는데요.

이를 shebang이라고 부릅니다.

 

보통, 아래와 같이 bash쉘로 선언해 줍니다.

 

#!/bin/bash

 

2. 변수 선언 방법

변수를 선언할 때는 공백 없이 = 기호를 사용합니다. 

대신 변수를 사용할 때는 $기호를 앞에 아래와 같이 붙입니다.

 

#!/bin/bash
name="홍길동"
echo "안녕하세요, $name 님!"

 

 

위와 같이, echo 명령어를 이용하면 원하는 문구를 화면에 출력할 수 있습니다.

 

3.  read 명령어로 사용자 입력받기

3-1. 입력받아 변수에 저장하기

사용자로부터 입력을 받아서 변수에 저장할 수도 있는데요.

아래와 같이, read 명령어를 사용하면 되는데요.

사용자의 입력을 기다리고,

입력된 값을 'name'이라는 변수에 저장하는 코드입니다.

 

read name  # 입력값을 name 변수에 저장

 

아래와 같이 작성하면 echo명령어없이,

프롬프트를 보여주고,

입력받을 수도 있습니다.

 

read -p "이름: " name  # -p 옵션으로 프롬프트 메시지 표시

 

3-2. 비밀번호 입력받기

입력내용이 표시되지 않도록 비밀번호를 입력받을 수도 있습니다.

 

read -s password  # -s 옵션으로 입력 내용을 숨김

 

3-3. 예제

 

아래와 같이 간단하게 사용해서 입력한 내용을 출력해볼 수 있겠습니다.

 

#!/bin/bash
echo "이름을 입력하세요:"
read name
echo "안녕하세요, $name 님!"

 

4. 조건문

bash 스크립트에서 조건문은 if, elif, else를 사용해서 작성할 수 있습니다. 

 

4-1. 비교 연산자

조건문에 대해 공부하기 전에,

스크립트에서 사용할 수 있는 비교연산자들에 대해 알아보겠습니다.

제가 많이 사용하는 것은,

'=', '!=', '-eq', '-gt', '-lt' 정도입니다.

 

  • 숫자비교시
    • -eq: 같다
    • -ne: 다르다
    • -gt: 크다
    • -lt: 작다
    • -ge: 크거나 같다
    • -le: 작거나 같다
  • 문자열 비교시
    • =: 같다
    • !=: 다르다
    • -z: 빈 문자열인지
    • -n: 빈 문자열이 아닌지
  • 파일 관련
    • -f: 파일이 존재하는지
    • -d: 디렉토리인지
    • -r: 읽기 권한이 있는지
    • -w: 쓰기 권한이 있는지
    • -x: 실행 권한이 있는지

 

4-2. if문

if문은 아래와 같이,

if 다음에 조건을 작성하고 then을 넣은 다음,

실행할 명령어를 작성하고 나서,

if를 거꾸로한 fi로 조건문의 종료를 알립니다.

 

if [ 조건 ]; then
    명령어
fi

 

파일관련해서 사용할 수 있는 아래의 옵션들을 이용해서,

조건문을 사용할 수 있는데요.

  • -f: 주어진 경로에 파일이 존재하고, 그것이 일반 파일인지 확인
    • 디렉토리나 특수 파일(소켓, FIFO 등)일 경우에는 거짓(False)을 반환
  • -e: 파일이나 디렉토리의 존재여부만 확인
  • -d: 디렉토리인지 확인

 

위의 옵션을 이용해 파일이 있는지 아래와 같이 사용할 수 있습니다.

 

if [ -f "/etc/passwd" ]; then
    echo "passwd 파일이 존재합니다"
fi

 

-e도 파일또는 디렉토리 사용에 많이 이용됩니다.

 

if [ -e "/path/to/file" ]; then
    echo "파일이 존재합니다."
else
    echo "파일이 존재하지 않습니다."
fi

 

4-2. if-else문

if-else문은 다음과 같이 사용할 수 있는데요.

else를 쓴다는 것 외에는 특별할 것은 없습니다.

 

if [ "$name" = "admin" ]; then
    echo "관리자입니다"
else
    echo "일반 사용자입니다"
fi

 

 

참고로 스크립트에서 문자열이 같다를 표현할 때는,

"=="이 아니고, "="입니다.

 

4-3. 종료 상태에 따른 if문

리눅스에서 각 명령어는 실행 후에 종료상태를 변환합니다.

이 상태는 다음 명령어를 통해서 확인할 수 있습니다.

  • $?
    • 0: 명령어 성공적으로 실행 됨
    • 1~255: 명령어 실행 중 오류가 발생함

한번 가장 간단한 'ls'명령어를 실행해 본 후,

아래와 같이 테스트 해보시면 쉽게 값을 볼 수 있습니다.

 

 

이제 이런 값을 이용해서 if문을 만들수도 있습니다.

아래와 같이 if문을 이용해,

특정 명령어를 실행한 후,

성공여부에 따른 조건을 넣을 수 있겠지요.

 

<특정 명령어 실행>
if [ $? -eq 0 ]; then
    echo "명령어가 성공적으로 실행되었습니다."
else
    echo "명령어 실행 중 오류가 발생했습니다."
fi

 

 

$?에 담긴 값을 이용하지 않고,

바로 아래와 같이,

if문을 작성할 수도 있습니다.

 

if <명령어>; then
    echo "성공"
else
    echo "실패"
fi

 

 

이번에는,

docker-compose를 사용할 때,

nginx설정을 바꾼 후,

다시 시작하는 스크립트를 보겠습니다.

 

nginx설정파일을 테스트하는 명령어를 조건에 놓고,

실패하면 exit 1이라는 명령어를 이용해 비정상 종료시키고요.

성공하면, nginx를 재시작하는 명령어를 아래와 같이 실행시키는 것 입니다.

 

echo "Nginx 설정 테스트"
if ! docker-compose exec nginx nginx -t; then
    echo "❌ Nginx 설정 테스트 실패"
    exit 1
fi

echo "Nginx 재시작" 
docker-compose exec nginx nginx -s reload

 

 

4-3. if-elif-els문

조건이 하나 더 들어가는 경우는,

elif를 아래와 같이 추가해서 사용하면 됩니다.

 

echo "숫자를 입력하세요:"
read number

if [ $number -eq 0 ]; then
    echo "0입니다"
elif [ $number -gt 0 ]; then
    echo "양수입니다"
else
    echo "음수입니다"
fi

 

 

아래는 elif를 이용해서 나이를 구분한 스크립트입니다.

 

#!/bin/bash
echo "나이를 입력해주세요:"
read age

if [ -z "$age" ]; then
    echo "나이를 입력하지 않았습니다"
elif [ $age -lt 20 ]; then
    echo "미성년자입니다"
elif [ $age -lt 65 ]; then
    echo "성인입니다"
else
    echo "어르신입니다"
fi

 

5. for문

5-1. 숫자범위 반복

숫자 범위로 반복할 때는 다음과 같이 사용해 주면 됩니다.

do와 done사이에 실행할 명령문을 넣어주면 됩니다.

 

#!/bin/bash
for i in {1..5}  # 1부터 5까지
do
    echo "숫자: $i"
done

 

 

혹은 아래와 같이 do를 바로 뒤에 붙일수도 있습니다.

 

#!/bin/bash
for i in {1..5}; do
    echo "숫자: $i"
done

 

5-2. 리스트로 반복하기

다음과 같이 리스트로 for...in문을 사용할 수도 있습니다.

 

for name in "아론" "애론" "히진"
do
    echo "이름: $name"
done

 

5-3. 예제

위에서 배운 내용들을 사용한 예제들을 보겠습니다.

다음은 오래된 로그파일을 삭제하는 스크립트인데요.

for...in문을 이용해서, /var/log디렉토리 내에서,

확장자가 log인 파일들을 순회합니다.

"$(find "$logfile" -mtime +30)"은 파일의 수정 시간이 30일보다 오래되었는지 확인하는 코드인데요.

그렇다면, 파일을 삭제하도록 하였습니다.

 

#!/bin/bash
# 30일 이상 된 로그 파일 삭제
echo "30일 이상 된 로그 파일 정리를 시작합니다..."

for logfile in /var/log/*.log
do
    if [ -f "$logfile" ] && [ $(find "$logfile" -mtime +30) ]; then
        echo "삭제: $logfile"
        rm "$logfile"
    fi
done

 

 

 

참고로 위에서 사용된,

-mtime은 파일의 수정 시간(modification time)을 기준으로 날짜를 체크하는 find 명령어의 옵션입니다.

 

"-mtime +N"은 N일보다 더 오래된 파일을 의미합니다.

 

find /var/log -mtime +30  # 30일보다 더 오래된 파일

 

6. 함수 정의 및 호출

함수를 정의할 때는 아래와 같이 "()"를 이용해서,

블록과 함께 작성해서 실행할 수 있습니다.

 

function_name() {
    # 함수 내용
    echo "함수가 실행되었습니다"
}

 

다른 표현 방법도 있는데요.

function키워드를 이용하는 것 입니다.

 

function function_name {
    # 함수 내용
    echo "함수가 실행되었습니다"
}

 

파라미터는 아래와 같이 사용하면 됩니다.

$1, $2와 같이 매개변수를 사용할 수 있습니다.

 

greeting() {
    echo "안녕하세요, $1님!"  # $1은 첫 번째 매개변수
}

# 함수 호출
greeting "홍길동"  # 출력: 안녕하세요, 홍길동님!

 

 

리턴값이 필요할 경우는 return이라는 키워드를 아래와 같이 이용해 주면 됩니다.

 

calculate_sum() {
    local num1=$1
    local num2=$2
    echo $((num1 + num2))  # echo로 결과 반환
    return 0  # 성공적인 실행을 의미
}

# 함수 결과 저장
result=$(calculate_sum 5 3)
echo "합계: $result"  # 출력: 합계: 8

 

좀 더 복잡한 예제를 보면 다음과 같습니다.

 

#!/bin/bash

# 로그 메시지 출력 함수
log_message() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$timestamp] $1"
}

# 파일 백업 함수
backup_file() {
    local source=$1
    local destination="$1.backup"
    
    if [ -f "$source" ]; then
        cp "$source" "$destination"
        log_message "$source 파일 백업 완료"
        return 0
    else
        log_message "에러: $source 파일이 존재하지 않음"
        return 1
    fi
}

# 함수 호출
log_message "백업 프로세스 시작"
backup_file "test.txt"

 

 

7. 환경변수 파일 사용하기

.env파일은 .gitignore에 포함시켜서 사용하는 환경변수 파일입니다.

아래와 같이 중요한 키 값들을 저장해 놓았다고 가정해 보겠습니다.

 

DB_HOST=localhost
DB_USER=admin
DB_PASS=secretpassword
API_KEY=abcd1234

 

이 파일을 스크립트에서 불러와 사용하는 방법이 있습니다.

source 명령어나 .(점) 명령어를 사용하면 되는데요.

 

아래와 같이 실행하면 됩니다.

source filename
# 또는
. filename

 

만약 아래와 같이 '.env'파일을 실행하면,

해당 파일의 변수들을 로드하게 됩니다.

 

# 환경변수 파일 로드
source .env

 

 

이렇게 스크립트내에서,

source명령어 사용시,

현재 셸 환경에서 환경변수값들을 쉽게 불러올 수 있습니다.

 

 

참고로 .env같이 민감한 파일은,

파일 권한을 제한적으로 설정하는 것이 좋은데요.

아래 명령어로 제한을 할 수 있습니다.

  • chmod 600 .env
    • 파일 소유자에게만 읽기와 쓰기 권한 부여
    • 그룹이나 기타 사용자에게는 권한이 없도록 함

 

8. 팁 및 주의할 점

8-1. 실행 권한 부여하기 

스크립트를 다 작성하고,

실행하기 전에 확인해야 하는 것이 있는데요.

스크립트가 있는 디렉토리에서,

'ls -la' 명령어를 실행해 줍니다.

나오는 기호들의 첫 4자리들은 다음의 의미를 갖고 있는데요.

  • -: 파일이면 '-', 디렉토리면 'd'
  • r: 읽기 권한
  • w: 쓰기 권한
  • x: 실행(execute)권한
    • 네 번째의 x 자리가 '-'로 나왔다면 실행권한이 없다는 뜻 입니다. 

'-rw-r--r--' 처럼 x가 없어서,

실행권한이 없다면,

아래 명령어를 이용해 부여해 주어야 합니다.

 

chmod +x script.sh

 

728x90

댓글