[Linux] 리눅스 환경 변수와 쉘 스크립트 기초 정리 및 실습

mommers·2026년 2월 2일

Linux

목록 보기
26/59
post-thumbnail

환경 변수와 앨리어스 (export, alias)

실습 내용

  1. env 명령어로 모든 환경변수 조회
  2. export MY_VAR="hello" 설정 후 스크립트에서 사용
  3. alias ll='ls -alF' 처럼 자주 쓰는 명령어 단축키 등록
  4. .bashrc 수정하여 영구 적용

export란?

현재 쉘에서 만든 변수를 자식 프로세스(새로 실행한 프로그램)에서도 쓸 수 있게 여권을 발급해주는 명령어입니다.

임베디드 개발에서 툴체인 경로 설정이나 컴파일 옵션을 지정할 때 필수적으로 사용됩니다.

동작 원리 (부모 vs 자식)

리눅스에서 터미널(부모)이 스크립트나 프로그램(자식)을 실행할 때, 기본적으로 변수는 상속되지 않습니다. export를 붙여야만 자식에게 전달됩니다.

상황

MY_VAR="hello" 라고 변수를 만들고 ./script.sh를 실행한다면:

  • 그냥 변수 (MY_VAR): 스크립트 안에서는 이 변수가 비어있음 (안 보임)
  • export 변수 (export MY_VAR): 스크립트 안에서도 "hello"라고 보임

1. 툴체인 경로 추가 (PATH)

컴파일러(arm-linux-gcc)를 아무 곳에서나 실행하려면 경로를 등록해야 합니다.

# 그냥 PATH=... 하면 make 실행할 때 적용 안 됨
# 꼭 export 해야 함
export PATH=$PATH:/opt/gcc-arm-10.2/bin

2. 크로스 컴파일 설정 (ARCH, CROSS_COMPILE)

리눅스 커널이나 U-Boot를 빌드할 때, Makefile에게 "나 ARM용으로 빌드할 거야"라고 알려줍니다.

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 이제 make만 쳐도 위 설정을 알아서 가져감
make defconfig

3. 라이브러리 경로 지정 (LD_LIBRARY_PATH)

내가 직접 만든 공유 라이브러리(.so)를 프로그램이 못 찾을 때 사용합니다.

export LD_LIBRARY_PATH=/home/pi/my_libs:$LD_LIBRARY_PATH
./my_program

주의사항: 재부팅하면 사라짐

터미널에서 친 export 명령어는 그 터미널 창을 끄거나 재부팅하면 사라집니다 (휘발성).

영구적으로 적용하려면 홈 디렉터리의 설정 파일(~/.bashrc 또는 ~/.zshrc) 맨 아래에 해당 export 명령어를 적어두어야 합니다.

# 설정 파일 열기
vi ~/.bashrc

# 맨 아래 추가
export PATH=$PATH:/opt/toolchain/bin

# 적용
source ~/.bashrc

환경 변수 실습

1. 모든 환경 변수 조회

# 모든 환경 변수 출력
env

# 또는
printenv

# 특정 환경 변수 확인
echo $PATH
echo $HOME
echo $USER

2. 환경 변수 설정 및 사용

# 일반 변수 (현재 쉘에서만)
MY_VAR="hello"
echo $MY_VAR

# 환경 변수 (자식 프로세스에게도 전달)
export MY_VAR="hello"

# 스크립트에서 사용
cat > test.sh << 'EOF'
#!/bin/bash
echo "MY_VAR의 값: $MY_VAR"
EOF

chmod +x test.sh
./test.sh

3. PATH 환경 변수

# 현재 PATH 확인
echo $PATH

# 새 경로 추가 (임시)
export PATH=$PATH:/home/pi/my_bin

# 확인
echo $PATH

# 영구 적용 (~/.bashrc에 추가)
echo 'export PATH=$PATH:/home/pi/my_bin' >> ~/.bashrc
source ~/.bashrc


앨리어스 (alias)

자주 쓰는 명령어 단축키 만들기

# 현재 세션에서만 적용
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# 사용
ll

# 앨리어스 목록 확인
alias

# 앨리어스 해제
unalias ll

영구 앨리어스 설정

# .bashrc 편집
nano ~/.bashrc

# 맨 아래 추가
alias ll='ls -alF'
alias la='ls -A'
alias proj='cd ~/project'
alias gs='git status'
alias gp='git push'
alias gc='git commit'

# 저장 후 적용
source ~/.bashrc

유용한 앨리어스 예제

# 디렉토리 이동
alias ..='cd ..'
alias ...='cd ../..'
alias proj='cd ~/project'

# Git 단축키
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline'

# 안전한 파일 조작
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 시스템 정보
alias temp='vcgencmd measure_temp'
alias mem='free -h'
alias disk='df -h'


쉘 스크립트 기초 (echo, variables)

실습 내용

  1. hello.sh 파일 생성 및 실행 권한 부여
  2. 변수 선언하고 echo "Hello $NAME" 출력하기
  3. 사용자 입력 받기 (read) 기능 구현

첫 번째 스크립트: hello.sh

스크립트 생성

# 스크립트 파일 생성
cat > hello.sh << 'EOF'
#!/bin/bash

# 주석: 이것은 주석입니다
echo "Hello, World!"
EOF

# 실행 권한 부여
chmod +x hello.sh

# 실행
./hello.sh

쉐뱅(Shebang)이란?

#!/bin/bash

스크립트 첫 줄의 #!은 이 파일을 어떤 인터프리터로 실행할지 지정합니다.

  • #!/bin/bash - Bash 쉘로 실행
  • #!/bin/sh - POSIX 호환 쉘로 실행
  • #!/usr/bin/python3 - Python3로 실행

변수 사용하기

기본 변수

#!/bin/bash

# 변수 선언 (= 앞뒤 공백 없이!)
NAME="Linux"
VERSION=5.15

# 변수 사용
echo "Hello, $NAME"
echo "Version: $VERSION"

# 중괄호 사용 (권장)
echo "Hello, ${NAME}!"

사용자 입력 받기 (read)

#!/bin/bash

# 사용자 이름 입력받기
echo "이름을 입력하세요:"
read NAME

echo "안녕하세요, ${NAME}님!"

# 한 줄로
read -p "나이를 입력하세요: " AGE
echo "당신의 나이는 ${AGE}세입니다."

명령어 실행 결과를 변수에 저장

#!/bin/bash

# 방법 1: 백틱 사용
CURRENT_DATE=`date`

# 방법 2: $() 사용 (권장)
CURRENT_USER=$(whoami)
FILE_COUNT=$(ls | wc -l)

echo "현재 날짜: $CURRENT_DATE"
echo "현재 사용자: $CURRENT_USER"
echo "파일 개수: $FILE_COUNT"


실습 예제

예제 1: 간단한 인사 스크립트

#!/bin/bash

read -p "이름을 입력하세요: " NAME
read -p "나이를 입력하세요: " AGE

echo "================================"
echo "이름: $NAME"
echo "나이: $AGE"
echo "현재 시간: $(date)"
echo "================================"

예제 2: 시스템 정보 출력

#!/bin/bash

echo "=== 시스템 정보 ==="
echo "호스트명: $(hostname)"
echo "사용자: $(whoami)"
echo "현재 디렉토리: $(pwd)"
echo "CPU 온도: $(vcgencmd measure_temp)"
echo "메모리 사용량:"
free -h


쉘 스크립트 제어문 (if, for)

실습 내용

  1. if문으로 파일이 존재하는지 체크하고, 없으면 생성
  2. for문으로 현재 폴더의 모든 파일을 순회하며 이름 출력
  3. 졸업 과제: 지정된 디렉터리의 로그 파일을 압축해서 백업 폴더로 옮기는 자동화 스크립트

if 조건문

기본 문법

#!/bin/bash

if [ 조건 ]; then
    # 조건이 참일 때 실행
    echo "조건 참"
fi

if-else

#!/bin/bash

AGE=20

if [ $AGE -ge 18 ]; then
    echo "성인입니다"
else
    echo "미성년자입니다"
fi

if-elif-else

#!/bin/bash

SCORE=85

if [ $SCORE -ge 90 ]; then
    echo "A학점"
elif [ $SCORE -ge 80 ]; then
    echo "B학점"
elif [ $SCORE -ge 70 ]; then
    echo "C학점"
else
    echo "재수강"
fi

비교 연산자

숫자 비교

-eq  # 같다 (equal)
-ne  # 다르다 (not equal)
-gt  # 크다 (greater than)
-ge  # 크거나 같다 (greater or equal)
-lt  # 작다 (less than)
-le  # 작거나 같다 (less or equal)

문자열 비교

=    # 같다
!=   # 다르다
-z   # 문자열이 비어있다
-n   # 문자열이 비어있지 않다

파일 검사

-e   # 파일이 존재한다
-f   # 일반 파일이다
-d   # 디렉토리이다
-r   # 읽기 가능하다
-w   # 쓰기 가능하다
-x   # 실행 가능하다

파일 존재 여부 확인

#!/bin/bash

FILE="test.txt"

if [ -e "$FILE" ]; then
    echo "$FILE 파일이 존재합니다"
else
    echo "$FILE 파일이 없습니다. 생성합니다..."
    touch "$FILE"
fi

디렉토리 검사 및 생성

#!/bin/bash

DIR="backup"

if [ -d "$DIR" ]; then
    echo "$DIR 디렉토리가 이미 존재합니다"
else
    echo "$DIR 디렉토리를 생성합니다"
    mkdir -p "$DIR"
fi


for 반복문

기본 문법

#!/bin/bash

# 리스트 순회
for i in 1 2 3 4 5; do
    echo "숫자: $i"
done

범위 사용

#!/bin/bash

# {시작..끝} 형식
for i in {1..10}; do
    echo "Number: $i"
done

# 증가값 지정
for i in {0..20..2}; do
    echo "짝수: $i"
done

파일 순회

#!/bin/bash

# 현재 디렉토리의 모든 파일
for file in *; do
    echo "파일: $file"
done

# 특정 확장자만
for cfile in *.c; do
    echo "C 파일: $cfile"
done

명령어 결과 순회

#!/bin/bash

# ls 결과를 순회
for file in $(ls); do
    if [ -f "$file" ]; then
        echo "파일: $file"
    elif [ -d "$file" ]; then
        echo "디렉토리: $file"
    fi
done


실습 예제

예제 1: 파일 존재 확인 및 생성

#!/bin/bash

FILES="log1.txt log2.txt log3.txt"

for file in $FILES; do
    if [ -e "$file" ]; then
        echo "$file 존재함"
    else
        echo "$file 생성 중..."
        touch "$file"
    fi
done

예제 2: 파일 정보 출력

#!/bin/bash

echo "현재 디렉토리의 파일 정보:"
echo "=========================="

for file in *; do
    if [ -f "$file" ]; then
        SIZE=$(ls -lh "$file" | awk '{print $5}')
        echo "파일: $file (크기: $SIZE)"
    fi
done

예제 3: 조건부 파일 처리

#!/bin/bash

for file in *.txt; do
    if [ -f "$file" ]; then
        LINES=$(wc -l < "$file")
        
        if [ $LINES -gt 100 ]; then
            echo "$file: 큰 파일 ($LINES 줄)"
        else
            echo "$file: 작은 파일 ($LINES 줄)"
        fi
    fi
done


로그 파일 백업 스크립트

요구사항

지정된 디렉터리의 로그 파일을 압축해서 백업 폴더로 옮기는 자동화 스크립트를 작성하세요.

기능 명세

  1. 로그 디렉토리 확인 (/var/log 또는 ~/logs)
  2. .log 확장자 파일 찾기
  3. 백업 디렉토리 생성 (~/backup)
  4. 현재 날짜로 압축 파일명 생성
  5. 로그 파일들을 tar.gz로 압축
  6. 압축 파일을 백업 디렉토리로 이동
  7. 작업 결과 출력

해답 예시

#!/bin/bash

# 설정
LOG_DIR="$HOME/logs"
BACKUP_DIR="$HOME/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="logs_backup_${DATE}.tar.gz"

echo "=== 로그 백업 스크립트 시작 ==="

# 1. 로그 디렉토리 확인
if [ ! -d "$LOG_DIR" ]; then
    echo "오류: 로그 디렉토리 $LOG_DIR 가 존재하지 않습니다"
    exit 1
fi

# 2. 백업 디렉토리 생성
if [ ! -d "$BACKUP_DIR" ]; then
    echo "백업 디렉토리 생성: $BACKUP_DIR"
    mkdir -p "$BACKUP_DIR"
fi

# 3. 로그 파일 개수 확인
LOG_COUNT=$(find "$LOG_DIR" -name "*.log" | wc -l)

if [ $LOG_COUNT -eq 0 ]; then
    echo "백업할 로그 파일이 없습니다"
    exit 0
fi

echo "백업할 로그 파일: $LOG_COUNT 개"

# 4. 압축
echo "압축 중..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$LOG_DIR" *.log 2>/dev/null

# 5. 결과 확인
if [ -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
    SIZE=$(ls -lh "$BACKUP_DIR/$BACKUP_FILE" | awk '{print $5}')
    echo "백업 완료: $BACKUP_FILE (크기: $SIZE)"
    
    # 6. 선택: 원본 로그 파일 삭제
    read -p "원본 로그 파일을 삭제하시겠습니까? (y/n): " ANSWER
    if [ "$ANSWER" = "y" ]; then
        rm -f "$LOG_DIR"/*.log
        echo "원본 로그 파일 삭제 완료"
    fi
else
    echo "오류: 백업 실패"
    exit 1
fi

echo "=== 백업 완료 ==="

고급 버전 (로그 로테이션 포함)

#!/bin/bash

LOG_DIR="$HOME/logs"
BACKUP_DIR="$HOME/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="logs_backup_${DATE}.tar.gz"
KEEP_DAYS=7  # 7일 이상 된 백업 파일 삭제

echo "=== 로그 백업 스크립트 (로테이션 포함) ==="

# 백업 디렉토리 생성
mkdir -p "$BACKUP_DIR"

# 로그 파일 확인
if [ ! -d "$LOG_DIR" ] || [ $(find "$LOG_DIR" -name "*.log" | wc -l) -eq 0 ]; then
    echo "백업할 로그 파일이 없습니다"
    exit 0
fi

# 압축
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$LOG_DIR" *.log 2>/dev/null

if [ $? -eq 0 ]; then
    echo "백업 완료: $BACKUP_FILE"
    
    # 오래된 백업 파일 삭제 (7일 이상)
    find "$BACKUP_DIR" -name "logs_backup_*.tar.gz" -mtime +$KEEP_DAYS -delete
    echo "오래된 백업 파일 정리 완료 (${KEEP_DAYS}일 이상)"
    
    # 백업 목록 출력
    echo "현재 백업 파일:"
    ls -lh "$BACKUP_DIR"/logs_backup_*.tar.gz
else
    echo "백업 실패"
    exit 1
fi

Crontab과 연동

자동 백업 설정

# crontab 편집
crontab -e

# 매일 새벽 2시에 백업 실행
0 2 * * * /home/pi/scripts/log_backup.sh >> /home/pi/backup/backup.log 2>&1

# 매주 일요일 자정에 백업
0 0 * * 0 /home/pi/scripts/log_backup.sh >> /home/pi/backup/backup.log 2>&1


참고 자료

profile
임베디드 개발자가 되기 위해 공부중입니다!

0개의 댓글