[스터디] Shell Script 기본 문법 사용법

hwwwa·2023년 1월 5일
1

Shell Script

*** Shell Script 작성 시 띄워쓰기 주의

SheBang (#!)

  • SheBang(#!) 은 2Byte의 Magic Number로 스크립트의 맨 앞에서 해당 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에 알려주는 역할을 함
    - SheBang이라는 이름은 Hash(#) 또는 Sharp(#) 과 Bang(!) 의 합성어에서 유래됨

  • 사용법

    #!<interpreter> [optional-arg]
    • #! 뒤에 공백(Space)이 하나 있어도 동작함
    • <Interpreter> 에는 프로그램의 절대경로를 입력
  • 사용 예시

    #!/bin/sh 
    #!/bin/bash 
    #!/usr/bin/pwsh 
    #!/usr/bin/env python3
    #!/usr/bin/env bash
  • 프로그램 실행 전 chmod +x <파일명> 로 파일에 실행권한 추가 필요

#!/usr/bin/env을 사용하는 경우

  • 프로그램의 절대경로는 실행 환경에 따라 달라질 수 있음
  • #!/usr/bin/env 로 설정하면 절대경로에 상관 없이 인터프리터의 위치를 찾아서 실행 가능
  • 즉, 여러 환경에서 실행되야할 스크립트라면 #!/usr/bin/env 를 사용

실행

  • shell script 실행 전에 실행 권한 추가 필요
# 권한 추가
$ chmod +x test.sh

# 실행
$ ./test.sh

입출력

  • 입력: read
    - -p : 프롬프트 메세지를 띄우며 입력을 받을 수 있는 옵션
  • 출력: echo
    - -e: escape 문자(\)를 사용하는 옵션
    - -n : 줄바꿈 없이 출력하는 옵션
# 입력
read NAME
read -p "message" name

# 출력
echo "Hello, $NAME!"
echo -e "\033[96mHello, $name!\033[0m"	# 출력 색상 바꾸기

변수

  • 선언: 변수명=데이터
  • 사용: $변수명
  • 삭제: unset 변수명
mysql_id='root'
mysql_directiory='/etc/mysql'
    
echo $mysql_id $mysql_directory

unset mysql_directiory
  • 전역 변수 : 변수명=데이터
  • 지역 변수 : local 변수명=데이터
  • 환경 변수 : export 변수명=데이터

변수 타입 지정

  • Bash 변수는 타입을 구분하지 않음. 기본적으로 문자열
  • 불완전한 형태의 declare, typeset 타입 지정 명령을 지원
  • 가급적 사용하지 않는 것이 좋음
# 읽기 전용 
# readonly string_variable="hello world" 문법과 동일 
declare -r string_variable 

# 정수 
# number_variable=10 문법과 동일 
declare -i number_variable=10 

# 배열 
# array_variable=() 문법과 동일 
declare -a array_variable 

# 환경 변수 
# export export_variable="hello world" 문법과 동일
declare -x export_variable="hello world" 

# 현재 스크립트의 전체 함수 출력 
declare -f 

# 현재 스크립트에서 지정한 함수만 출력 
declare -f 함수이름

예약 변수

  • HOME : 사용자의 홈 디렉토리
  • PATH : 실행 파일을 찾을 경로
  • PWD : 사용자의 현재 작업중인 디렉토리
  • FUNCNAME : 현재 함수 이름
  • SECONDS : 스크립트가 실행된 초 단위 시간
  • PPID : 부모 프로세스의 PID
  • BASH : BASH 실행 파일 경로
  • UID : 사용자 ID
  • USERNAME : 사용자 이름
  • GROUPS : 사용자 그룹(/etc/passwd 값을 출력)

위치 매개 변수

  • $0 : 쉘 스크립트 이름

  • $1~$9 : 명령줄 인수

    • 10 이상은 ${10} 처럼 {} 사용 필요
  • $* : 모든 명령줄 인수 리스트

  • $# : 인수의 개수

  • ex) shell.sh

    #!/bin/bash
    
    echo $$ $0 $1 $* $#
    $ ./shell.sh kkk 222
    
    15249 ./shell.sh kkk kkk 222 2

특수 매개 변수

  • $$ : 쉘의 프로세스 번호 (pid)
  • $? : 최근 실행한 명령어의 종료 값
    • 0 성공, 1~125 에러, 126 파일이 실행가능하지 않음, 128~255 시그널 발생
  • $! : 최근에 실행한 백그라운드(비동기) 명령의 PID
  • $- : 현재 옵션 플래그
  • $_ : 지난 명령의 마지막 인자로 설정된 특수 변수

매개 변수 확장

  • ${변수} : $변수와 동일하지만 {}를 사용해야만 동작하는 것들이 있음 (ex. echo ${string})
  • ${변수:위치} : 위치 다음부터 문자열 추출
  • ${변수:위치:길이} : 위치 다음부터 지정한 길이 만큼의 문자열 추출
  • ${변수:-단어} : 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가
  • ${변수-단어} : 변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가
  • ${변수:=단어} : 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능
  • ${변수=단어} : 변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능
  • ${변수:?단어} : 변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료
  • ${변수?단어} : 변수 미선언시만 단어 출력 후 스크립트 종료
  • ${변수:+단어} : 변수 선언시만 단어 사용
  • ${변수+단어} : 변수 선언 혹은 NULL일때 단어 사용
  • ${#변수} : 문자열 길이
  • ${변수#단어} : 변수의 앞부분부터 짧게 일치한 단어 삭제
  • ${변수##단어} : 변수의 앞부분부터 길게 일치한 단어 삭제
  • ${변수%단어} : 변수의 뒷부분부터 짧게 일치한 단어 삭제
  • ${변수%%단어} : 변수의 뒷부분부터 길게 일치한 단어 삭제
  • ${변수/찾는단어/변경단어} : 처음 일치한 단어를 변경
  • ${변수//찾는단어/변경단어} : 일치하는 모든 단어를 변경
  • ${변수/#찾는단어/변경단어} : 앞부분이 일치하면 변경
  • ${변수/%찾는단어/변경단어} : 뒷부분이 일치하면 변경
  • ${!단어*}, ${!단어@} : 선언된 변수중에서 단어가 포함된 변수명 추출

리스트

  • 1차원 리스트만 지원함
  • 선언: 변수명=(데이터1데이터2데이터3...)
  • 사용: ${변수명[인덱스번호]}
daemons=("httpd" "mysqld" "vsftpd") // 변수 선언
echo ${daemons[1]}                  // $daemons 배열의 두 번째 인덱스에 해당하는 myspld 출력
echo ${daemons[@]}                  // $daemons 배열의 모든 데이터 출력
echo ${daemons[*]}                  // $daemons 배열의 모든 데이터 출력
echo ${#daemons[@]}                 // $daemons 배열의 배열 크기 출력
    
filelist=( $(ls) )                  // 해당 쉘 스크립트 실행 디렉토리의 파일 리스트를 배열로 변수 선언
echo ${filelist[*]}                 // $filelist 모든 데이터 출력

비교 연산자

문자열 비교

  • 문자1 = 문자2 또는문자1 == 문자2 : 문자 1과 문자 2가 일치
  • 문자1 != 문자2 : 문자 1과 문자 2가 일치하지 않는다.
  • -z 문자 : 문자가 null 이면 참(값이 없으면 true)
  • -n 문자 : 문자가 null 이 아니면 참

정수 비교

  • 값1 -eq 값2 : 값이 같음(equal)
  • 값1 -ne 값2 : 값이 같지 않음(not equal)
  • 값1 -lt 값2 : 값1이 값2보다 작음(less than)
  • 값1 -le 값2 : 값1이 값2보다 작거나 같음(less or equal)
  • 값1 -gt 값2 : 값1이 값2보다 큼(greater than)
  • 값1 -ge 값2 : 값1이 값2보다 크거나 같음(greater or equal)

파일 검사

  • -e 파일명 : 파일이 존재하면 참
  • -d 파일명 : 파일이 디렉토리면 참
  • -h 파일명 : 파일이 심볼릭 링크 파일이면 참
  • -f 파일명 : 파일이 일반파일이면 참
  • -r 파일명 : 파일이 읽기 가능하면 참
  • -s 파일명 : 파일크기가 0이 아니면 참
  • -u 파일명 : 파일이 set-user-id가 설정되면 참
  • -w 파일명 : 파일이 쓰기 가능이면 참
  • -x 파일명 : 파일이 실행 가능이면 참

논리 연산

  • 조건1 -a 조건2 : AND
  • 조건1 -o 조건2 : OR
  • 조건1 && 조건2 : AND
  • 조건1 || 조건2 : OR
  • !조건 : NOT
  • true
  • false

if 조건문

if [ 조건 ] 
then
    명령문
else
    명령문
fi
  • 조건문 한줄에 작성하기 : if [ 조건 ]; then 명령문; fi

  • ex) 디렉토리가 존재하는지 확인하고 없다면 만든 후 디렉토리에 파일 복사하기

    • backup.sh
    #!/bin/bash
    if ! [-d bak]; then
        mkdir bak
    fi
    cp *.log bak
  • 참고) 특정 문자열을 포함하는지 비교하는 방법

    • [[ "$STRING1" == *STRING2* ]]
    • [[ "$STRING1" =~ STRING2 ]]

선택문(case)

case ${string} in 
	hello) echo "${string}: hello 일때" 
	;; 
	wo*) echo "${string}: wo로 시작하는 단어 일때" 
	;; 
	s|start) echo "${string}: s 혹은 start 일때" 
	;; 
	e|end) echo "${string}: e 혹은 end 일때" 
	;; 
	*) echo "${string}: 기타" 
	;; 
esac

반복문

  • break, continue 사용

for 반복문

for 변수 in 변수값1 변수값2 .... 
do  
	명령문 
done 

while 반복문

while [ 조건문 ]  
do 
	명령문 
done 

until 반복문

  • 수행 조건이 false 일때 실행됨
until [ 조건문 ]
do 
	명령문
done

함수

MyFunction () { 
	echo  "Calling MyFunction" 
}

MyParamFunc() {
   echo  "Calling MyParamFunc p1: $1, p2: $2"
}

#함수 호출
MyFunction 
MyParamFunc param1 param2

함수 값 반환

  • 함수 외부에서 $?를 통해 return value 읽기

    my_function() {
      echo "Calling my_function p1: $1, p2: $2"
      return 100
    }
    
    my_function aaa 123
    
    ret=$?
    echo "Return value: $ret"
  • return value를 변수에 직접 할당

    my_function() {
        echo 100
    }
    
    ret=$(my_function aaa 123)
    
    echo "Return value: $ret"
  • 함수에서 값을 리턴하지 않고 전역 변수에 값을 할당하여 함수 밖에서 사용

    my_function() {
    	echo "Calling my_function p1: $1, p2: $2"
    	ret=100
    }
    
    my_function aaa 123
    
    echo "Return value: $ret"

0개의 댓글