Linux/Linux 명령어, 스크립트, 설정

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

Developer88 2025. 1. 14. 15:43
반응형

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

총정리해 보겠습니다.

 

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