linuxshell (2)
2025-09-16 14:52:51
반응형

🐚 9. 셸 스크립트 프로그래밍

 

1️⃣ 스크립트 작성 & 실행 방법

  • 스크립트 시작은 항상 #!/bin/bash
  • 실행 방법
 
sh script.sh # sh로 실행
chmod +x script.sh && ./script.sh # 실행 권한 주고 직접 실행 
 
flowchart LR A[사용자 입력] --> B[Shell Script] B --> C[리눅스 커널 실행] C --> D[결과 출력]

2️⃣ 자주 사용하는 셸 스크립트

📌 로그 백업 & 정리 스크립트

#!/bin/bash
# log_backup.sh

LOG_DIR=
"/var/log/myapp"# 로그가 있는 폴더
BACKUP_DIR=
"/var/backups/myapp"# 백업 저장 폴더
DATE=$(
date +%Y%m%d) # 오늘 날짜 (예: 20250916)
mkdir -p "$BACKUP_DIR" # 백업 폴더 없으면 생성

# 7일 지난 .log 파일 찾아서 백업하고 내용 비움 find "$LOG_DIR" -type f -name "*.log" -mtime +7 | whileread file; do       tar -czf "$BACKUP_DIR/$(basename $file).$DATE.tar.gz" "$file" # 압축 백업
      >
"$file" # 원본 로그는 지우지 않고 내용만 삭제done

👉 현업에서 매우 많이 씀 (로그 용량이 차서 서버가 죽는 걸 방지)


📌 프로세스 모니터링 & 재시작

 
#!/bin/bash
# monitor.sh

PROCESS="myapp"                                           # 감시할 프로세스 이름
if ! pgrep -x "$PROCESS" > /dev/null; then                # 실행 중인지 확인
    echo "$(date): $PROCESS not running. Restarting..." >> /var/log/monitor.log
    systemctl start "$PROCESS"                            # 안 돌아가면 재시작
fi

👉 운영팀 필수 (서비스가 죽었을 때 자동 복구)


📌 서버 헬스체크

 
#!/bin/bash
# healthcheck.sh

echo "===== $(hostname) ====="      # 서버 이름
echo "Uptime:"                     # 서버 켜진 시간
uptime
echo

echo "Disk usage:"                 # 디스크 사용량
df -h | grep -v tmpfs
echo

echo "Top 5 memory-consuming processes:" # 메모리 많이 쓰는 상위 5개
ps aux --sort=-%mem | head -n 6

👉 운영팀 기본 (서버 상태를 빠르게 확인할 때)


📌 대량 파일 이름 변경

 
#!/bin/bash# rename.shfor file in *.txt; do# 모든 .txt 파일에 대해mv"$file" "${file%.txt}.bak" # 확장자 .txt → .bak 로 변경done

👉 파일 대량 처리할 때 개발자들이 자주 활용


📌 배포 자동화 (단순 버전)


#!/bin/bash
 
# deploy.sh
 APP_DIR=
"/opt/myapp"
 
# 앱 코드 경로
 BACKUP_DIR=
"/opt/backup"
 
# 백업 저장 경로
 DATE=$(
date
 +%Y%m%d%H%M) 
# 현재 시간
 tar -czf 
"$BACKUP_DIR
/myapp_
$DATE
.tar.gz" 
"$APP_DIR

# 현재 버전 백업
 git -C 
"$APP_DIR
" pull origin main 
# 최신 코드 받기
 systemctl restart myapp.service 
# 서비스 재시작
 

👉 스타트업/중소기업에서 직접 서버 운영 시 자주 사용


3️⃣ 실습 예제: .txt → .bak 변환하기

① 연습 디렉토리 만들기

 
mkdir ~/rename-test # 테스트용 폴더 만들기 cd ~/rename-test

② 샘플 파일 생성

 
touch file1.txt file2.txt file3.txt # 빈 텍스트 파일 3개 생성 ls

③ 스크립트 작성

 
vi rename.sh

내용:


#!/bin/bash
 
for
 file 
in
 *.txt; 
do
 
# 모든 .txt 파일에 대해
 
mv
 
"$file

"${file%.txt}
.bak" 
# 확장자를 .bak으로 변경
 
done
 

④ 실행 권한 부여

chmod +x rename.sh

⑤ 실행

 
./rename.sh ls

👉 결과: file1.bak file2.bak file3.bak


❓ Quiz : 되돌리기

.bak → .txt 로 다시 복원하려면?

 
#!/bin/bashfor
file
in *.bak;
do# 모든 .bak 파일에 대해
mv"$file" "${file%.bak}.txt" # 확장자를 .txt로 변경
done

⊡ 기본if문

if1.sh
if [ 조건]
then
   참일경우실행
fi
#!/bin/bash
if [ "KIM" = "KIM" ]
then
        echo "It's true."
fi
exit 0


⊡ if-else문

if2.sh
if [ 조건]
then
    참일경우실행
else
    거짓일경우실행
fi
#!/bin/bash
if [ "KIM" = "LEE" ]
then
       echo "It's true."
else
       echo "It's false."
fi
exit 0

⊡ 조건문에들어가는비교연산자

if3.sh
#!/bin/bash
if [ 100 -eq 200 ]
then
       echo "100 and 200 are the same."
else
       echo "100 and 200 are different"
fi
exit 0

⊡ 파일과 관련된 조건

if4.sh
#!/bin/bash
fname=/lib/systemd/system/httpd.service
if [ -f $fname]
then
        head -5 $fname
else
        echo "Web server is not installed."
fi
exit 0


⊡ case~esac문

case1.sh
#!/bin/bash
case "$1" in
            start)
                   echo "Start~";;
            stop)
                   echo "Stop~";;
         restart)
                   echo "Restart~";;
                  *)
                    echo "I don't know what it is~~";;
esac
exit 0

 

case2.sh
#!/bin/bash
echo "Is Linux fun? (yes / no)"
read answer
case $answer in yes |y |Y | Yes |YES)
         echo "That's good."
         echo "Cheer up~ ^^";;
    [nN]*)
         echo "That's too bad.. ㅠㅠ";;
      *)
         echo "You should have just typed YES or NO" exit 1;;

esac
exit 0


⊡ AND, OR 관계연산자

andor.sh
#!/bin/bash

echo "Please enter the file name you want to view."
read fname
if [ -f $fname] && [ -s $fname] ;
then
       head -5 $fname
else
       echo "The file does not exist or its size is 0."
fi
exit 0


⊡ for~in문

forin.sh
#!/bin/bash
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
     hap=`expr $hap + $i`
done
echo "The sum of 1 to 10 is " $hap
exit 0

forin2.sh
#!/bin/bash
for fnamein $(ls *.sh)
do
     echo "---$fname---"
     head -3 $fname
done
exit 0


⊡ while문

while.sh
#!/bin/bash
while true
do
     echo "Ubuntu"
done
exit 0
#!/bin/bash
while :
do
     echo "Ubuntu"
done
exit 0

while2.sh
` -> 햅틱보다는 요즘 $로 많이 사용
#!/bin/bash
hap=0 i=1
while [ $i-le 10 ]
do
     hap=`expr $hap + $i`
     i=`expr $i+ 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0
#!/bin/bash
hap=0 i=1
while [ $i-le 10 ]
do
     hap=$((hap + i))
     i=$((i+ 1))
done
echo "The sum of 1 to 10 is: $hap"
exit 0

while3.sh
#!/bin/bash

echo "Please enter your password."
read mypass
while [ "$mypass" != "1234" ]
do
     echo "Incorrect. Please re-enter."
     read mypass
done
echo "Success~"
exit 0


until문

조건식이참일때까지(=거짓인동안) 계속반복
until.sh
#!/bin/bash

hap=0
i=1
while [ $i-le 10 ]
do
    hap=`expr $hap + $i`
    i=`expr $i + 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0

#!/bin/bash

hap=0
i=1
until [ $i-gt 10 ]
do
    hap=`expr $hap + $i`
    i=`expr $i + 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0


break, continue, exit, return

bce.sh
#!/bin/bash

echo "Starts infinite loop input. (b : break, c : continue, e : exit)"
while true; do
         read input
         case $input in
                 b | B)
                          break
                          ;;
                 c | C)
                         echo "If you press continue, it will return to the while condition" continue
                         ;;
                e | E)
                         echo "If you press exit, the program (function) will be completely terminated."
                         exit 1
                         ;;
                *)
                        echo "Unknown input. Please press b, c, or e."
                        ;;
          esac
done
echo "If you press break, it will exit while and print this sentence."
exit 0

 

 


🎯 정리 

  • 셸 스크립트 = 반복되는 일을 자동으로 해주는 “작은 프로그램”
  • 현업에서 많이 쓰는 것
    • 로그 정리 (서버 터짐 방지)
    • 프로세스 모니터링 (서비스 다운되면 자동 복구)
    • 서버 헬스체크 (운영팀 점검)
    • 대량 파일 이름/텍스트 처리
    • 배포 자동화
  • 중학생 수준 비유: 집에서 매일 하는 일(청소, 정리, 확인)을 사람이 직접 하지 않고 자동 로봇이 대신 해주는 것 🚀
반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

10. 리눅스 종합 실습  (0) 2025.09.17
08. 리눅스 쉘 사용하기  (0) 2025.09.16
07. 리눅스 사용자 관리  (0) 2025.09.15
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15
2025-09-16 13:38:01
반응형

🐚 리눅스 셸 사용하기 정리

1️⃣ 셸 기본

  • 셸(Shell): 사용자가 입력한 명령을 해석해서 운영체제(OS)에게 전달하는 번역기 같은 프로그램
  • 종류: sh, bash, csh, ksh 등
  • 기본 프롬프트 기호:
    • $ → 일반 사용자
    • # → 관리자(root)
    • % → csh 같은 셸

👉 기본 셸 바꾸기

 
chsh -s /bin/bash # 기본 셸을 bash로 변경

2️⃣ 셸 사용법

📌 출력 명령

 
echo"Hello"# 화면에 글자 출력printf"Hi\n"# 줄바꿈 포함해서 출력

📌 특수문자

  • * : 모든 파일
  • ? : 한 글자 대체
  • [] : 특정 문자 집합
  • ~ : 홈 디렉토리
  • ; : 여러 명령 연속 실행
  • | : 앞 결과 → 뒤 명령 입력

📌 리다이렉션

 
ls > file.txt # 명령어 결과를 file.txt에 저장 (덮어쓰기)
ls >> file.txt # 명령어 결과를 file.txt 끝에 추가
cat < file.txt # file.txt 내용을 입력으로 사용
ls not_exist 2> error.log # 에러 메시지만 error.log에 저장
 

3️⃣ 셸 환경

🧩 환경 변수

SOME=testecho$SOME# 변수 값 출력 → test bash -c 'echo "child:$SOME"'# 전파 안 됨
export SOME # 환경 변수로 등록 bash -c 'echo "child:$SOME"'# 전파 됨

🧹 환경 변수 해제

 
export SOME1=hello env | grep SOME1 # 환경 변수 확인 export -n SOME1 # 환경 변수 속성만 제거 unset SOME1 # 변수 완전히 삭제

4️⃣ alias (자주 쓰는 명령어 단축키)

alias ll='ls -lF --color=auto'# 파일 목록 자세히 보기
alias la='ls -A'# 숨김 파일까지 보기
alias ..='cd ..'# 상위 폴더로 이동
aliasrm='rm -i'# 삭제할 때 확인 질문
alias grep='grep --color=auto'# grep 결과 색상 강조
aliasdf='df -h'# 디스크 용량 보기
alias myip='curl ifconfig.me'# 외부 IP 확인

👉 현업에서 가장 자주 쓰는 것

  • ll, la → 파일 확인
  • .., ... → 디렉토리 이동
  • rm -i, cp -i, mv -i → 실수 방지 (중요 파일 날리지 않도록)
  • grep --color → 로그 분석할 때 필수
  • df -h, du -h → 서버 디스크 용량 확인
  • myip → 서버 외부 IP 확인

5️⃣ 함수(Function)

 
function cdpwd { if [ -z "$1" ]; then# 인자가 없으면echo"Usage: cdpwd <dir>"# 사용법 출력return 1 # 에러 코드 반환ficd"$1" && pwd# 해당 폴더로 이동하고 현재 경로 출력 }

👉 cdpwd /tmp → /tmp로 이동하면서 경로까지 확인


6️⃣ 히스토리 활용

 
history | tail# 최근 사용한 명령어 보기 !! # 마지막 명령어 다시 실행 !5 # 히스토리에서 5번 명령어 실행

👉 현업에서는 history | grep ssh 같은 식으로, 과거에 쓴 명령어 찾는 경우가 많음


7️⃣ 프롬프트 (PS1) 꾸미기

 
echo"$PS1" # 현재 프롬프트 확인
PS1=
'[${USER} ${PWD}] $ '# 사용자 + 경로 표시
PS1=
'\u@\h \w\$ '# 사용자@호스트 경로 $
PS1=
"\e[34;1m\u@\h \w \$ \e[0m"# 파란색, 볼드체

👉 서버가 여러 개일 때 프롬프트 색상 다르게 해두면 실수 줄일 수 있음 (예: 운영서버 빨간색, 테스트서버 초록색)


📊 전체 흐름 (Mermaid 다이어그램)

 

 


🎯 정리

  • = "컴퓨터에게 명령 내리는 번역기"
  • 환경 변수 = "컴퓨터에 메모해둔 값"
  • alias = "명령어 단축키"
  • 리다이렉션/파이프 = "결과를 저장하거나, 다른 명령어에 전달"
  • PS1 = "프롬프트 꾸미기"
  • 현업에서 필수 = alias rm='rm -i', grep --color, df -h, myip
반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

10. 리눅스 종합 실습  (0) 2025.09.17
09. Linux Shell Script Programming  (0) 2025.09.16
07. 리눅스 사용자 관리  (0) 2025.09.15
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15