Shell Script

쉘스크립트(Shell script)

지나짱-* 2022. 11. 27. 19:41

쉘 스크립트를 이용하여 기존 운영하던 엣지에서 새로운 엣지로 데이터를 마이그레이션을 진행할 예정이다. 많은 데이터들을 옮기는 과정에서 스크립트를 구현해야되기에 신속하고 정확한 방법을 찾아서 만들어야한다.

 

#!/bin/bash

스크립트 최상단에는 항상 이 구문이 적혀있어야한다.

 

변수(Variable)

변수명=값 으로 변수를 선언하고, 사용할때는 앞에 $를 붙여준다. 중괄호를 이용하는 방법도 있다. ${변수}식으로 중괄호로 묶어서 사용한다.

#!/bin/bash

h="hello"
w="world"
echo "${h}, ${w}"

export를 사용하여 다른 쉘 스크립트에서 사용할 수 있다. exam.sh는 변수 선언하고 export를, exam2.sh는 그 변수를 출력하는 쉘 스크립트

#!/bin/bash
#exam.sh
export MY_VAR="test"

./exam2.sh
#!/bin/bash
#exam2.sh
echo ${MY_VAR}

예약변수

쉘 스크립트에서 사용자가 정해서 만들 수 없는 이미 정의된 변수가 존재한다. 

변수 설명
HOME 사용자 홈 디렉토리
PATH 실행 파일의 경로이다. chmod, mkdir 등의 명령어들은 /bin이나 /usr/bin, /sbin에 위치하는데, 이 경로들을 PATH 지정하면 여러분들은 굳이 /bin/chmod를 입력하지 않고, chmod 입력만 해주면 된다.
LANG 프로그램 실행 시 지원되는 언어
UID 사용자의 UID
SHELL 사용자가 로그인시 실행되는 쉘
USER 사용자의 계정 이름
FUNCNAME 현재 실행되고 있는 함수 이름
TERM 로그인 터미널

배열(Array)

쉘 스크립트에서 배열은 1차원 배열만 지원하며 중괄호를 사용한다. 배열 원소는 소괄호안에 공백으로 구분한다. 배열 안 원소는 문자열이든 정수든 상관 없이 쓸 수 있는 특징이다.

#!/bin/bash

arr=("hello" "world" 1 2 3 4 5)

echo "배열 전체 : ${arr[@]}"
echo "배열 원소의 갯수 : ${#arr[@]}"
echo "배열 첫번째 : ${arr}, 혹은 ${arr[0]}"
echo "5번 index를 갖는 배열의 원소 : ${arr[5]}"

arr[5]="five"

echo "5번 index를 갖는 배열의 원소 : ${arr[5]}"

# 5번 원소 해제
unset arr[5]
echo "5번 원소 삭제 후"
echo "5번 index를 갖는 배열의 원소 : ${arr[5]}"
echo "6번 index를 갖는 배열의 원소 : ${arr[6]}"

함수(Function)

다른 프로그래밍 언어와 같이 쉘 스크립트에서도 함수를 사용할 수 있다. 함수명 앞 function은 써주지 않아도 무관하다. 주의 할 점은 함수가 호출되기 전에 함수가 정의되어 있어야하며 호출할때는 괄호를 써주지 않고 호출해야한다.

function 함수명(){
 ... 내용 ...
}
#!/bin/bash

function func(){
        echo "func()"
}

#함수 호출
func

비교문

쉘스크립트에서 비교문은 특이하다.

if [ 값1 조건 값2 ]; then
	... 작업 내용 ...
fi

 

#!/bin/bash

function func(){
        a=10
        b=5

        if [ ${a} -eq ${b} ]; then
                echo "a와 b는 같다."
        fi

        if [ ${a} -ne ${b} ]; then
                echo "a와 b는 같지 않다."
        fi

        if [ ${a} -gt ${b} ]; then
                echo "a가 b보다 크다."
        fi

        if [ ${a} -ge ${b} ]; then
                echo "a가 b보다 크거나 같다."
        fi

        if [ ${a} -lt ${b} ]; then
                echo "a가 b보다 작다."
        fi

        if [ ${a} -le ${b} ]; then
                echo "a가 b보다 작거나 같다."
        fi

}

#함수 호출
func

쉘스크립트는 명령어를 다루는 스크립트이기 때문에 파일이 존재하는지, 디렉토리가 존재하는지 등 파일과 관련된 조건 여부도 조건문을 통해 알 수 있다. 앞에 느낌표(!)를 써주고 조건을 기재하면 그 조건이 false일때 참이 성립한다.

파일 관련 조건

조건 설명
if [ -d ${변수} ]; then 
if [ ! -d ${변수} ]; then
${변수}의 디렉토리가 존재하면 참이 성립
${변수}의 디렉토리가 존재하지 않으면 참이 성립
if [ -e ${변수} ]; then 
if [ ! -e ${변수} ]; then 
${변수}라는 파일이 존재하면 참
${변수}라는 파일이 존재하지 않으면 참
if [ -L ${변수} ]; then 파일이 symbolic link이면 참
if [ -s ${변수} ]; then 파일의 크기가 0보다 크면 참
if [ -S ${변수} ]; then 파일 타입이 소켓이면 참
if [ -r ${변수} ]; then 파일을 읽을 수 있으면 참
if [ -w ${변수} ]; then 파일을 쓸 수 있으면 참
if [ -x ${변수} ]; then 파일을 실행할 수 있으면 참
if [ -f ${변수} ]; then 파일이 정규 파일이면 참
if [ -c ${변수} ]; then 파일이 문자 장치이면 참
if [ ${변수1} -nt ${변수2}]; then 변수1의 파일이 변수2의 파일보다 최신 파일이면 참
if [ ${변수1} -ot ${변수2}]; then 변수1의 파일이 변수2의 파일보다 최신이 아니면 참
if [ ${변수1} -ef ${변수2}]; then 변수1의 파일과 변수2의 파일이 동일하면 참

만약 AND조건과 OR조건을 섞어서 쓴다면 AND는 -a, OR은 -o를 이용해서 조건을 추가할 수 있다.

function func(){
        a=aa
        b=bb
        if [ -f ${a} -a -d ${b} ]; then
                echo "a는 파일이고 b는 디렉토리 "
        fi
}

#함수 호출
func

 

또한 여러 조건을 걸려면, 즉, C언어에서 else if역할을 하는 것은 elif라는 것을 사용하여 else if와 똑같은 역할을 할 수 있게 해준다. ( elif[ 조건 ]; then )

만약 반복문에서 사용하여 조건이 참일때 반복문을 멈추고 싶을때 break라는 키워드를 사용하여 반복문을 멈출 수 있다.

C에서 switch case와 동일한 구문을 하는 문법도 존재한다. 아래와 같이 case문을 사용하면 된다. 각 case의 끝을 보면 세미콜론 2개로 종료하는 것을 볼 수 있다.

#!/bin/bash

case ${1} in
        "linux") echo "리눅스" ;;
        "unix") echo "유닉스" ;;
        "windows") echo "윈도우즈" ;;
        "MacOS") echo "맥OS" ;;
        *) echo "머야" ;;
esac

반복문 반복문 중 for문

#!/bin/bash

function func(){
        echo "사용예1"
        for i in 1 2 3 4 5
        do
                echo "${i}"
        done

        echo "사용예2"
        list="1 2 3 4 5"
        for i in ${list}
        do
                echo "${i}"
        done

        echo "사용예3"
        for i in {1..5}
        do
                echo "${i}"
        done

        echo "사용예4: 크기를 2만큼 증가시키면서 출력"
        for i in {1..5..2}
        do
                echo "${i}"
        done

        echo "사용예5: 배열을 이용"
        arr=(1 2 3 4 5)
        for i in "${arr[@]}"
        do
                echo "${i}"
        done


        echo "사용예6: C와 유사한 형식의 for문"
        for ((i=0; i<5; i++)); do
                echo "${i}"
        done
}

#함수 호출
func