env 명령어로 모든 환경변수 조회export MY_VAR="hello" 설정 후 스크립트에서 사용alias ll='ls -alF' 처럼 자주 쓰는 명령어 단축키 등록.bashrc 수정하여 영구 적용현재 쉘에서 만든 변수를 자식 프로세스(새로 실행한 프로그램)에서도 쓸 수 있게 여권을 발급해주는 명령어입니다.
임베디드 개발에서 툴체인 경로 설정이나 컴파일 옵션을 지정할 때 필수적으로 사용됩니다.
리눅스에서 터미널(부모)이 스크립트나 프로그램(자식)을 실행할 때, 기본적으로 변수는 상속되지 않습니다. export를 붙여야만 자식에게 전달됩니다.
MY_VAR="hello" 라고 변수를 만들고 ./script.sh를 실행한다면:
MY_VAR): 스크립트 안에서는 이 변수가 비어있음 (안 보임)export 변수 (export MY_VAR): 스크립트 안에서도 "hello"라고 보임컴파일러(arm-linux-gcc)를 아무 곳에서나 실행하려면 경로를 등록해야 합니다.
# 그냥 PATH=... 하면 make 실행할 때 적용 안 됨
# 꼭 export 해야 함
export PATH=$PATH:/opt/gcc-arm-10.2/bin
리눅스 커널이나 U-Boot를 빌드할 때, Makefile에게 "나 ARM용으로 빌드할 거야"라고 알려줍니다.
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# 이제 make만 쳐도 위 설정을 알아서 가져감
make defconfig
내가 직접 만든 공유 라이브러리(.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
# 모든 환경 변수 출력
env
# 또는
printenv

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

# 일반 변수 (현재 쉘에서만)
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

# 현재 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 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'

hello.sh 파일 생성 및 실행 권한 부여echo "Hello $NAME" 출력하기read) 기능 구현# 스크립트 파일 생성
cat > hello.sh << 'EOF'
#!/bin/bash
# 주석: 이것은 주석입니다
echo "Hello, World!"
EOF
# 실행 권한 부여
chmod +x hello.sh
# 실행
./hello.sh

#!/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}!"

#!/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"

#!/bin/bash
read -p "이름을 입력하세요: " NAME
read -p "나이를 입력하세요: " AGE
echo "================================"
echo "이름: $NAME"
echo "나이: $AGE"
echo "현재 시간: $(date)"
echo "================================"

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

if문으로 파일이 존재하는지 체크하고, 없으면 생성for문으로 현재 폴더의 모든 파일을 순회하며 이름 출력#!/bin/bash
if [ 조건 ]; then
# 조건이 참일 때 실행
echo "조건 참"
fi
#!/bin/bash
AGE=20
if [ $AGE -ge 18 ]; then
echo "성인입니다"
else
echo "미성년자입니다"
fi
#!/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

#!/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

#!/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

#!/bin/bash
echo "현재 디렉토리의 파일 정보:"
echo "=========================="
for file in *; do
if [ -f "$file" ]; then
SIZE=$(ls -lh "$file" | awk '{print $5}')
echo "파일: $file (크기: $SIZE)"
fi
done

#!/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

지정된 디렉터리의 로그 파일을 압축해서 백업 폴더로 옮기는 자동화 스크립트를 작성하세요.
/var/log 또는 ~/logs).log 확장자 파일 찾기~/backup)#!/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 -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
