쉘스크립트(Shell script)
쉘 스크립트를 이용하여 기존 운영하던 엣지에서 새로운 엣지로 데이터를 마이그레이션을 진행할 예정이다. 많은 데이터들을 옮기는 과정에서 스크립트를 구현해야되기에 신속하고 정확한 방법을 찾아서 만들어야한다.
#!/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