[Docker +] 쉘 프로그래밍 Shell Programming 문법과 간단 실습

2025. 3. 13. 02:38·BEYOND SW [4] DevOps

0. 들어가기 전에...  쉘 프로그래밍 맛보기!😋

✏️ls 명령어 텍스트를 메모장에 쓰고. vi test.sh (내용: ls) 

✏️ 메모장에 권한을 주고  chmod 755 test.sh

✏️실행하면  ./test.sh 

~~따란🎉 ls 명령이 실행된 결과가 뜸 ~~

 

 


쉘 프로그래밍 Shell Programming

리눅스의 명령어를 최대한 활용방법으로 리눅스 명령어로 프로그래밍을 하는 것이다.
쉘 프로그램은 기본적으로 시스템 명령어와 프로그래밍 구문으로 이루어져 있다.
⭐쉘 프로그래밍은 반복적인 작업을 자동화 할 수 있다. 이를 도커에서 활용할 수 있다. (참고 목차⌨️실전 예제 1)

1️⃣ 스크립트 실행 방법

맛보기에서 봤던 것처럼 쉘 스크립트 파일을 만들고 실행하는 방법!!

방법 설명 명령어
절대경로 파일의 절대경로를 그대로 입력해서 실행 [파일의 절대경로]
sh 명령어 사용 쉘을 직접 실행해서 파일 실행 sh [파일이름]
실행 권한 주기 실행 파일처럼 직접 실행 chmod 755 [파일이름]
./[파일이름]

2️⃣ 변수

변수명=값

(1) 환경 변수

  • 시스템 환경 정보를 저장하는 변수
  • 대문자로 되어 있음
    예시 설명
    PATH 실행 파일 검색 경로
    PS1 프롬프트 표시 형식

(2) 사용자 정의 변수

  • 사용자가 직접 작성한 변수
  • 첫 글자는 문자나 _로 시작해야 함

(3) 특수 변수

  • 쉘에서 제공하는 특별한 변수
  • 예시: 현재 쉘의 PID, 마지막 명령어의 프로세스 번호 등

(4) 위치 매개변수

쉘 스크립트 실행 시 전달받는 인자들

$0 = 스크립트 이름  
$1 ~ $9 = 첫 번째 ~ 아홉 번째 인자  

(5) 변수 사용법

test=Hello
echo $test

 

[실습1]

 

[실습2]


3️⃣ 조건문 (if 문)

(1) 기본 if 문

if [ 조건 ]
then
  수행 명령어
fi

(2) 조건 종류

문자열 검사

조건식 설명
str1 = str2 같으면 true
str1 != str2 다르면 true
-n str 비어있지 않으면 true

산술 비교

조건식 설명
A -eq B 같으면 true
A -ne B 다르면 true
A -gt B A가 B보다 크면 true

파일 검사

조건식 설명
-d file 디렉토리
-f file 일반 파일
-r file 읽기 가능

논리 연산

연산자 설명
! NOT
-a AND
-o OR

(3) if ~ else

if [ 조건 ]
then
  명령어1
else
  명령어2
fi

[실습]

(4) elif

if [ 조건1 ]
then
  명령어1
elif [ 조건2 ]
then
  명령어2
else
  명령어3
fi

(5) case 문

case "$변수" in
'red')
  echo "Color is Red"
  ;;
'blue' | 'sky')
  echo "Color is Blue"
  ;;
*)
  echo "NONE"
  ;;
esac

4️⃣ 사용자 입력 받기

read 변수명

5️⃣ 반복문

(1) for 문

for 변수 in 값들
do
  명령어
done

[실습]

#!/bin/bash


for i in 1 2 3 4 5
do
        echo $i
done

for i in $(seq 1 10)
do
        echo $i
done

cnt=1
while [ $cnt -le 5 ]
do
        echo $cnt
        (( cnt ++ ))
done

(2) while 문

while [ 조건 ]
do
  명령어
done

예시

#!/bin/bash

var=5

while [ $var -lt 10 ]
do
  echo $var
  var=`expr $var \+ 1`
done

6️⃣ 내부 명령어

명령어 설명
exit 쉘 스크립트 종료
continue 반복문 내에서 현재 진행중인 작업 중단하고 반복문 처음으로 이동
break 반복문을 종료. done 다음 명령어 실행
return 함수 종료 및 결과 값 반환
expr 수식의 결과 출력
read 표준 입력에서 입력 받아 변수에 할당

✅ 실습 예제: 1부터 10까지, 5가 되면 멈추기

#!/bin/bash

var=0

while [ $var -le 10 ]
do
  var=`expr $var \+ 1`

  if [ $var -eq 5 ]
  then
    break
  fi

  echo $var
done

 


7️⃣ 명령어 활용법

명령어 설명
cut -d로 구분자 지정, -f로 필드 지정
awk -F로 구분자 지정 후 출력 제어
wc -c 문자 수, -l 라인 수
sed -i로 파일에 바로 적용

1) cut 명령어

필드 단위로 텍스트를 분리하거나 특정 필드만 추출할 때 사용한다. 주로 구분자가 있는 데이터 파일(CSV, TSV 등)을 다룰 때 유용하다.

  • -d : 구분자를 지정한다.
  • -f : 몇 번째 필드를 추출할지 지정한다.

예시:

cut -d: -f1 /etc/passwd

:를 기준으로 첫 번째 필드를 출력한다. 위 명령어는 시스템 사용자 계정 목록을 추출할 때 많이 사용한다.


2) awk 명령어

텍스트 라인에서 특정 패턴을 검색하거나 필드를 기준으로 데이터를 추출하고 가공할 때 사용한다.

  • -F : 필드 구분자를 지정한다.
  • {print $1} : 첫 번째 필드를 출력한다.

예시:

awk -F: '{print $1}' /etc/passwd

:를 기준으로 필드를 나누고 첫 번째 필드를 출력한다. cut 명령어보다 조건 처리나 패턴 매칭이 더 강력하다.


3) wc 명령어

파일의 라인 수, 단어 수, 문자 수 등을 계산할 때 사용한다.

  • -c : 문자의 수를 출력한다.
  • -l : 라인 수를 출력한다.

예시:

wc -l sample.txt

sample.txt 파일의 총 라인 수를 출력한다. 로그 파일 라인 수를 확인할 때 자주 사용한다.

 


4) sed 명령어

파일의 텍스트를 편집하거나 특정 패턴을 찾아서 수정, 삭제할 때 사용한다.

  • -i : 변경 내용을 파일에 바로 저장한다. 옵션을 주지 않으면 변경된 결과만 출력하고 파일 내용은 바뀌지 않는다.

자주 쓰는 패턴

sed 's/[패턴1]/[패턴2]/g' 파일

⬆️패턴1을 패턴2로 전부 변경한다.

sed '/[패턴]/d' 파일

⬆️지정한 패턴이 포함된 라인을 삭제한다.

sed '/^$/d' 파일

⬆️공백 라인을 삭제한다. 파일 정리할 때 특히 유용하다.

예시

#!/bin/bash

total=`df -h | grep centos | cut -d" " -f4`
avail=`df -h | grep centos | awk -F" " '{print $4}'`

echo "Total Size is $total"
echo "Avail Size is $avail"

8️⃣ 함수

(1) 기본 형태

function 함수이름() {
  명령어들
}

함수이름

(2) 지역 변수 사용

#!/bin/bash

var=1234

function test() {
  local var=5678
  echo "local variable is $var"
}

echo "before variable is $var"
test
echo "after variable is $var"

(3) 매개변수 전달

#!/bin/bash

function test() {
  local var=$1
  echo "$var"
}

test 1234

(4) 결과값 반환

#!/bin/bash

function test() {
  return 10
}

test
result=$?

echo $result

⌨️실전 예제 1

👩🏻‍🏫만약에 사용량이 70% 이상이면 ‘큰일이다’를 출력하는 쉘 프로그램 작성하기.

#!/bin/bash

total=`free | grep Mem | awk '{ print $2 }'`
used=`free | grep Mem | awk '{ print $3 }'`

result=$(($used * 100 / $total ))

echo $result

if [ $result -ge 70 ]
then
        echo "큰일이다!!!"
fi

⌨️실전 예제 2

#!/bin/bash

i=0
flag=0
total=0

for test in `awk -F"," '{print $4 "-" $8}' 2020 | awk -F"-" '{print $1 " " $3}'`
do
  i=`expr $i + 1`

  if [ $flag = 1 ]
  then
    echo $test
    total=`expr $total + $test`
    flag=0
  fi

  if [ `expr $i % 3` = 1 -a $test -ge 20 -a $test -lt 30 ]
  then
    echo "age is $test"
    flag=1
  fi

  if [ `expr $i % 3` = 0 ]
  then
    continue
  fi

done

echo "======================"
echo "Total is $total"
echo "======================"

'BEYOND SW [4] DevOps' 카테고리의 다른 글

[k8s] 쿠버네티스(Kubernetes)란 무엇인가?  (2) 2025.03.14
[k8s] 실습 ① ubuntu서버에 containerd 준비하기  (3) 2025.03.14
[Docker] 2일차 - 도커 네트워크의 이해 실습  (2) 2025.03.12
[Docker] 2일차 - Dockerfile 작성부터 이미지 배포까지  (1) 2025.03.12
[Docker] 1일차 실습 - docker-compose.yml + 설정 문법  (0) 2025.03.12
'BEYOND SW [4] DevOps' 카테고리의 다른 글
  • [k8s] 쿠버네티스(Kubernetes)란 무엇인가?
  • [k8s] 실습 ① ubuntu서버에 containerd 준비하기
  • [Docker] 2일차 - 도커 네트워크의 이해 실습
  • [Docker] 2일차 - Dockerfile 작성부터 이미지 배포까지
알파카1234
알파카1234
기대와는 다른 현실에 실망하고, 대신 생각지도 않던 어떤 것을 얻고, 그로 인해 인생의 행로가 미묘하게 달라지고, 한참의 세월을 지나 오래전에 겪은 멀미의 기억과 파장을 떠올리고, 그러다 문득 자신이 어떤 사람인지 조금 더 알게 되는 것. 생각해보면 나에게 여행은 언제나 그런 것이었다. - 김영하 『여행의 이유』 p. 51.
  • 알파카1234
    알파카 로그
    알파카1234
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (97)
      • BEYOND SW [1] 기반기술 (20)
        • 강의 메모 (2)
        • 리눅스 & 네트워크 (8)
        • SQL & DB (6)
        • 소프트웨어공학 아키텍처 (4)
      • BEYOND SW [2] 프론트엔드 (0)
        • HTML CSS (0)
      • BEYOND SW [3] 백엔드 (28)
      • BEYOND SW [4] DevOps (14)
      • BEYOND SW [5] 최종프로젝트 (4)
      • WEB front-end 개념정리 (4)
        • 웹 동작 원리와 개념 (0)
        • 웹퍼블리싱을 위한 HTML + CSS (2)
        • 웹퍼블리싱을 위한 Javascript (2)
      • 딥러닝 AI 공부 (4)
      • 2021-가을학기 (16)
        • 프로그래밍개론 (8)
        • 심리통계분석 I (8)
        • 데이터베이스설계와질의 (0)
      • 2024-봄학기 (0)
        • 프로그래밍언어론 (0)
        • 현대사회와심리학 (심리학개론) (0)
        • 현대사회와언어심리학 (언어심리학개론) (0)
      • 잡담 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    작문
    명령프롬프트 django 명령어
    (wsl update 오류 해결 방법)
    명령프롬프트 장고 명령어
    wsl update failed
    리눅스 도커 설치
    도커 이미지 push
    파이썬
    django rest framework 객체 저장되는 곳
    django rest framework 모델
    도커 이미지 pull
    ubuntu docker 설치 명령어
    django 백엔드
    db.sqlite3
    docker desktop 무한대기
    파이썬 접근제어자
    django db
    도커 허브에 이미지 업로드
    django 모델 객체가 저장되는 곳
    Django
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
알파카1234
[Docker +] 쉘 프로그래밍 Shell Programming 문법과 간단 실습
상단으로

티스토리툴바