💡 핵심 요약 (Executive Summary)
본 가이드는 bash doc1 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.
📑 Table of Contents
Reference & Guidelines (NOTE)
Reference
url: 배시 쉘 프로그래밍-Jinlib
예시
bash
#!/bin/bash
# My First Script Program
printf "I love UNIX !\n"
pwd
exit 0
스크립트 구성요소
-
! (매직 넘버)
- 스크립트 파일의 가장 처음에 위치
- 스크립트를 실행할 프로그램을 지정
- 쉘이 아닌 커맨드에서도 사용 가능. ex) #!/bin/more
- # (주석)
- 쉘 명령
- 쉘에서 실행 가능한 커맨드를 포함할 수 있음.
- 쉘 프로그램 → 아래에 기술
Shell Program 문법요소
- 쉘 변수
- 지정 방식: varname = value
- 변수 표현식
형식 기능 결과 시뮬레이션 $namename의 값으로 대체 $(name)name의 값으로 대치. 변수 이름이 다른 구문과 인접해 있을 때 사용 $(name:-word)name이 정의되어있으면 그 값을 사용. 아니면 word 사용 if name==null { null }
if name==undefined { ‘word’ }
if hasVal(name) { name }$(name:=word)name이 정의되지 않았거나, null이면 word를 대입하고 그 값을 사용 if name==null { ‘word’ }
if name==undefined { ‘word’ }
if hasVal(name) { name }$(name:+word)name이 정의되어 있고, 그 값이 null이 아니면 word를 사용 if name==null { null }
if name==undefined { undefined }
if hasVal(name) { ‘word’ }$(name:?word)name이 정의되어 있고, 그 값이 널이 아니면 그 값을 사용, 그렇지 않으면 word 출력 후 종료. if name==null
{ print(‘word’) and exit() }
if name==undefined
{ print(‘word’) and exit() }
if hasVal(name)
{ name } - 변수 문자열 처리 – 값이 문자열일 경우 문자열 내 패턴을 찾아 일부분 제거하는 표현식
형식 기능 ${variable%pattern}variable내 값의 뒤부터 패턴과 일치하는 첫번째 부분을 찾아서 제거 ${variable%%pattern}variable내 값의 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거 ${variable#pattern}variable내 값의 앞부터 패턴과 일치하는 첫번째 부분을 찾아서 제거 ${variable##pattern}variable내 값의 앞부터 패턴과 일치하는 가장 큰 부분을 찾아서 제거 - 인자처리
- 스크립트 실행할때 인자로 주어진 값, 매개변수
- 위치매개변수
명령행 인자 의미 $0쉘 스크립트의 이름 $1 - $9커맨드 실행시에 주어진 첫번쨰부터 9번쨰까지 인자 $(10)10번째 인자 $#전체 인자 개수 $모든 인자→ \$1 \$2 \$3 $@\$*과 동일함 “$”모든 인자→ “\$1 \$2 \$3” “$@”모든 인자→ “\$1” “\$2” “\$3” $?최근 실행된 명령의 종료 값 - 실행문법
- 특수문자 처리
인용부호 기능 사용법 작은 따옴표 ( ’ ‘)모든 특수문자들이 해석되는것을 막음 echo ‘$test’
$test큰 따옴표 ( ” “)변수나 명령의 대체만 허용 echo “$test”
100백 슬래시 ( \)단일문자가 해석되는것을 막음 echo \$test
$test - 명령 실행결과를 값(문자열)로 리턴
| 기호 | 사용법 |
| — | — |
| 백 쿼터 (` `) | echo `date` |
| \$(명령) | echo \$(date) | - 입력스트림
- 정적 입력 – 터미널이나 파일로부터의 입력, 단일행
- 형식
형식 용도 read x 표준입력에서 한 행을 입력받아 변수 \$x에 저장 read first last 표준입력에서 한 행을 입력받아 첫번째 단어를 변수 \$first에 저장하고 나머지 모두를 변수 \$last에 저장 read -p prompt prompt를 출력하고 입력을 기다린다. 입력된 값은 변수 \$REPLY에 저장 - 사용 예시
- 형식
bash
#!/bin/bash
# 키보드 입력 처리를 테스트 하는 스크립트
read x # 아무 메시지 없이 사용자 입력을 기다림
echo "x : $x" # 사용자가 임의의 값을 입력하면 출력
read x y # 첫 단어는 x, 나머지는 y에 저장
echo "x is $x y is $y" # x, y 값 출력
read -p “Input : “ # Input : 을 출력한 후 입력 기다림
echo "input : $REPLY" # $REPLY에 자동 저장된 입력값 출력
- 동적 입력 – 명령문으로 입력받기, 여러행
- 형식
command << TERMINATOR
입력내용
TERMINATOR
TERMINATOR는 임의로 정하는 명칭이며 흔히 EOF(End Of File)을 사용한다. - 사용 예시
- 형식
bash
#!/bin/bash
# 주석
<< EOF
AAAAAA
BBBBBB
CCCCCC
EOF
# here 문서 테스트. user1에게 메일을 보냄
mail user1 << END
This is a test mail for here document
END
-
연산자
연산자 의미 사용 예시 -음수 -x!논리 부정(NOT) (( ! x < y ))~비트 반전(NOT) ~y*/%곱셈, 나눗셈, 나머지 let y=3 * 5+-덧셈, 뺄셈 let x=x+1<<>>비트왼쪽 시프트, 비트 오른쪽 시프트 (( y = x << 3 ))<=>=<>==!=비교 연산 (( x < y ))&^|비트 AND, XOR, OR let “z = x ^ y”&&||논리 AND, OR (( x=변수값 지정 let z=1*=/=%=+===<<=>>=&=^=|=단축 연산 let z+=1 -
제어문
- 조건 테스트 - 문자열 연산자
| 문자열 연산자 | 동작 |
| --- | --- |
|str = pattern| str이 pattern과 일치. = 연산자 양쪽에 공백 |
str == pattern
|str != pattern| str이 pattern과 일치하지 않음 |
|str| str이 null이 아님 |
|-z str| str 길이가 0 |
|-n str| str 길이가 0이 아님 |
|-l str| str의 길이 리턴 (조건식이 아님) | -
조건 테스트 - 플래그
test 플래그 동작 -a file파일이 존재 -e file파일이 존재 -L file심볼릭 링크 파일 -O file사용자가 file의 소유자 -G file파일의 그룹 ID가 스크립트의 그룹 ID와 같음 -S file소켓 파일 -r file읽기 가능 -w file쓰기 가능 -x file실행 가능 -b file블록 장치 특수 파일 -c file문자 장치 특수 파일 -d file디렉토리 파일 -p file파이프 파일 -u filesetuid 권한 부여 파일 -g filesetgid 권한 부여 파일 -k filesticky bit 접근 권한 부여 파일 -s file파일의 크기가 0이 아님 -
조건문 - if
bash
#!/bin/bash # test_elif: if-elif 문 테스트 echo “Input Score : “ read score if (( $score >= 90 )); then echo “Your score is great. “ elif (( $score >= 80 )); then echo “Your score is good. “ else echo “Your score is not good. “ fi
-
조건문 - if
-
조건문 - case
bash
#!/bin/bash
# case 테스트 스크립트
: <<EOF
주어진 변수의 값에 따라 실행할 명령 따로 지정
변수의 값이 value1 이면 value1부터 ;;을 만날 때까지 명령 실행
값의 지정에 특수기호, | (or 연산자) 사용 가능
일치하는 값이 없으면 기본값인 * 부터 실행
EOF
echo "Select command :"
read cmd
case $cmd in
[0-9]) # 0부터 9까지 임의의 숫자
date
;;
"cd" | "CD") # cd 또는 CD
echo $HOME
;;
[aA-C]*) # 소문자 a, 대문자 A,B,C로 시작하는 임의의 문자열
pwd
;;
*)
echo" Usage : select command"
;;
esac
- 반복문 - for
bash
#!/bin/bash
# test_for: for 테스트 스크립트
: <<EOF
list 내 모든 엘레먼트를 변수로 반환하며 반복 (forEach)
list 대신 $(<file)을 사용하면 외부 파일의 내용을 입력으로 받아서 처리한다.
EOF
for num in 0 1 2
do
echo "Number is $num"
done
- 반복문 - while
bash
#!/bin/bash
# test_while: while을 이용해 1부터 10까지 합을 구하는 스크립트
: <<EOF
조건이 true인 동안 명령 반복
EOF
count=1
sum=0
while (( count <= 10 ))
do
(( sum += count ))
let count+=1
done
echo "Sum(1~10) : $sum"
- 반복문 - until
bash
#!/bin/bash
# test_until: 지정한 사용자가 로그인하면 알리는 스크립트
: <<EOF
#조건이 true가 될때까지 명령 반복
EOF
echo "Input name :" # 입력 안내문 출력
read person # 유저 이름을 person에 저장
until who | grep $person # > /dev/null
do
sleep 5 # 유저가 접속 중이 아니면 5초 쉼
done
- 반복문 - select
bash
#!/bin/bash
# test_select: 사용자 입력에 따라 pwd,date 명령실행
: <<EOF
메뉴를 생성할 수 있는 반복 실행문이다.
list에 지정한 항목을 자동으로 선택 가능한 메뉴로 만들어 화면에 출력해준다.
사용자는 각 항목에 자동으로 부여된 번호를 선택한다.
사용자 입력은 select와 in 사이에 지정된 변수에 저장
보통 case 문과 결합하여 입력 값을 처리한다.
EOF
PS3="Input command(1~3) "
select cmd in pwd date quit
do
case $cmd in
pwd)
pwd ;;
date)
date;;
quit)
break;;
*)
echo "Invalid input. select number"
;;
esac
REPLY=
done
- 반복 제어문 - continue
bash
#!/bin/bash
# test_cont: continue 테스트
: << EOF
루프 안에서 사용한다.
이후 실행 순서를 무시하고 루프의 처음으로 돌아가는 명령
숫자를 지정하면 중첩된 루프 안에서 특정 루프의 처음으로 돌아갈 수 있다.
EOF
for person in $(< list) # `cat list`와 동일
do
if [[ $person == user2 ]] then
continue # user2 이면 건너뜀
fi
echo “Hello, $person”
done
- 함수
- 선언문
bash
# typeset -f 명령어를 통해 시스템에 등록된 함수를 확인 할 수 있다.
function {{ 함수명 }}
{
...
}
- 함수 종료 - return
bash
#!/bin/bash
# 함수 리턴값 테스트
function sum {
typeset sum
(( sum= $1 + $2 ))
return $sum
}
sum $1 $2
echo "$1 + $2 = $?"
# 함수 본문 안의 마지막 문장 실행
# return 문 실행
# +) 지정한 값이 함수의 종료값으로 $?에 저장된다.
# 결과 :
# bash {{ filename }} 3 4
# 3 + 4 = 7
- 함수 삭제 - unset
bash
unset -f { 함수명 }
- 디버깅
-
bash -x
bash
# 가장 간단한 스크립트 실행 오류 수정방법이다. # 스크립트의 각 행이 실행될 때마다 화면에 출력된다. bash -x { 함수명 }
-
bash -x
-
trap
bash
#!/bin/bash # test_trap: trap 테스트 스크립트 trap 'echo "$LINENO : count=$count " ' DEBUG count=1 sum=0 while (( count <= 10 )) do (( sum += count )) let count+=1 done echo "Sum(1~10) : $sum " # * 지정한 시그널이 스크립트로 전달될 때마다 지정한 명령 실행 # * 스크립트의 명령이 한 줄씩 실행될 때마다 DEBUG 시그널이 스크립트로 전달된다. # * DEBUG 시그널을 받을 때마다 원하는 변수 값 출력이 가능하다. # => 즉. 스크립트가 실행되는 도중 변수값 확인이 가능하다.
Leave a Reply