shell script 기초

shell script 기초

요즘 업무를 진행하다 보니, shell을 쓰는 경우가 있는데 문법을 한번 제대로 공부하고 넘어가면 좋을 것 같아서 자주 사용하는 정도로 정리했습니다.

1. 목표

  • shell script를 만들고, 권한을 부여해 실행하는 방법에 대해서 알아본다.
  • 입력, 출력하는 방법에 대해서 알아본다.
  • 변수 선언, 변수 치환에 대해서 알아본다.
  • if, switch, loop, 함수 작성하는 방법에 대해서 알아본다.

2. 들어가기 전에

2.1. shell script 선언

파일 생성후(test.sh) 맨 상단에 #!/bin/sh를 선언해주어야 한다.

#!/bin/sh

2.2. shell script파일 실행권한을 부여

$ sudo chmod +x 'shell 파일명'
$ sudo chmod 755 'shell 파일명'
$ sudo chmod +x test.sh

2.3. shell script 실행 하는 방법

다음 방법중에 하나로 실행하면 된다.

$ ./test.sh
$ sh test.sh
$ bash test.sh

3. 입/출력

입력은 read로 출력은 echo를 통해서 한다.

#!/bin/sh

read name
echo "hello, $name"

실행결과

$ ./test.sh 
andrew 					
hello, andrew 	

4. 변수

  • 변수의 이름으로는 영문자 대소문자, 숫자, 언더바를 사용하고, 필자는 대문자 언더바(MY_NAME)과 같이 사용한다.
  • 변수의 값은 보통은 ““(쌍따옴표)를 이용하는데, ‘‘(홑따옴표)나 그냥 문자열을 입력해도, 출력은 됩니다. 하지만 권장 사항은 ““쌍따옴표를 사용하는 것을 추천합니다.
#!/bin/sh

myname='andrew'
MY_NAME1="betty"
MY_NAME2=didi

echo $myname
echo $MY_NAME1
echo $MY_NAME2

4.1. 특별한 변수

  • shell script에는 특별한 변수가 있다. $로 시작한다.
변수 기능
$0 스크립트명
$1~$9 shell script 실행시 넘기는 인수값. $1은 첫번째 인수, $2는 두번째 인수…$9는 아홉번째 인수
$# 스크립트의 전달된 인수의 수
$* 모든 인수를 모아 하나로 처리
$@ 모든 인수를 각각 처리
$$ 이 쉘스크립트의 프로세스 ID
$? 직전에 실행한 커맨드의 종료값 (0: 성공, 1: 실패)
$! 마지막으로 실행한 백그라운드 프로세스 ID

5. 변수 치환

문법 설명
$name 또는 ${name} 해당 변수값을 치환
${name:=andrew} 변수가 아직 셋팅되지 않거나 공백 문자열의 경우, andrew를 반환하고, name변수에 저장함 ✅
${name:-andrew} 변수가 아직 셋팅되지 않거나 공백문자열의 경우, andrew를 반환하고, name변수에 저장되지 않음
${name:+andrew} 변수가 셋팅되지 않은 경우에, andrew를 반환하고, name변수에 저장되지 않음
${name:?andrew} name값이 없으면 변환에 실패하고, 에러를 표시한다.

이렇게 써놨지만 사실 그냥 변수 치환 정도만 쓰임!!

6. 배열

#!/bin/bash

#배열을 만드는 방법
FRUIT_ARRAY=("apple" "banana" "orange")

# 배열에 인덱스에 값을 셋팅하는 방법
FRUIT_ARRAY[0]="kiwi"

# 개별 아이템 접근 방법
echo "FRUIT_ARRAY[0]: ${FRUIT_ARRAY[0]}"
echo "FRUIT_ARRAY[1]: ${FRUIT_ARRAY[1]}"

#모든 아이템 출력하기
echo "FRUIT_ARRAY[*]: ${FRUIT_ARRAY[*]}"
echo "FRUIT_ARRAY[@]: ${FRUIT_ARRAY[@]}"

실행결과

$./test.sh
FRUIT_ARRAY[0]: kiwi
FRUIT_ARRAY[1]: banana
FRUIT_ARRAY[*]: kiwi banana orange
FRUIT_ARRAY[@]: kiwi banana orange

7. 오퍼레이터

산수연산은 expr 1 + 1와 같이 한다.

연산자 의미
+ 덧셈 echo expr 1 + 1 → 2
- 뺄셈 echo expr 2 - 1 → 1
/* 제곱 echo expr 2 \\* 2 → 4
/ 나눗셈 echo expr 10 / 2 → 5
% 나머지 echo expr 10 / 4 → 2
= 값대입 a=$b (b의 값은 a에 저장된다.)
== 동일 [ “$a” == “$b” ] $a와 $b가 동일한 경우 TRUE를 반환
!= 다름 [ “$a” != “$b” ] $a와 $b가 동일하지 않는 경우 TRUE를 반환

8. if 조건문

if문에 들어갈 조건식

비교 의미
-eq 동일 [ “$a” -eq “$b” ] $a와 $b가 동일한 경우 TRUE 반환
-ne 다름 [ “$a” -ne “$b” ] $a와 $b가 다른 경우 TRUE 반환
-gt 보다 큼 [ “$a” -gt “$b” ] $a가 $b 보다 큰 경우에 TRUE 반환
-lt 보다 작음 [ “$a” -lt “$b” ] $a가 $b 보다 작은 경우에 TRUE 반환
-ge 보다 크거나 같음 [ “$a” -ge “$b” ] $a가 $b 보다 크거나 같은 경우에 TRUE 반환
-le 보다 작거나 같음 [ “$a” -le “$b” ] $a가 $b 보다 작거나 같은 경우에 TRUE 반환
! 가 아니다 [ ! “$a” -gt “$b” ]$a가 $b보다 크지 않은 경우 TRUE 반환
-o 어느쪽이든 [ “$a” -gt “$b” -o “$a” -lt “$b” ] $a가 $b보다 크거나 작은경우 TRUE 반환
-a 양쪽 (&&) [ “$a” -gt 90 -a “$a” -lt 100 ] $a가 90보다 크고 100보다는 작은 경우 TRUE 반환
-z 문자열이 비었는가 [ -z “$a” ]$a에 어떤 것도 지정되지 않은 경우 TRUE 반환
-n 문자열이 지정되었는가 [ -n “$a” ] $a에 어떠한 것이 지정되어 있다면 TRUE 반환

if문 기본 문법(if-else)은 다음과 같다.

if [ 조건식 ]
then 
	echo '조건식이 참인경우'
else 
	echo '조건식이 거짓인경우'
fi

if-elseif-else 문법은 다음과 같다.

#!/bin/sh
if [ 조건식 ]
then 
	echo '조건식이 참인경우'
elif [ 다른 조건식 ]
then
	echo '다른조건이 참인경우'
else 
	echo '모든 조건식이 거짓인경우'
fi

9. switch case

#!/bin/sh
FRUIT=apple

case $FRUIT in 
	"apple") echo "사과";;
	"orange") echo "오렌지";;
	"banana") echo "바나나";;
esac

10. 루프 (반복문)

10.1. while loop

  • 해당 조건과 일치할때 반복
#!/bin/sh 

a=0
while [ $a -lt 5 ]
do 
	echo $a # a를 출력
	a=`expr $a + 1` # 1을 더해줌
done
  • a의 초기값이 0
  • 5보다 작은 경우에는 do 문을 실행해서 a의 값을 +1더해줌. 그렇게 반복

10.2. until loop

while과는 반대로, 해당 조건과 일치할 때까지 반복한다.

#!/bin/sh 
a=0 
until [ ! $a -lt 5 ] 
do 
	echo $a
	a=`expr $a + 1`
done
  • 조건식이 $a가 5보다 크거나 같은 경우를 만족할때까지, do를 실행
  • a값이 0,1,2…4 까지 출력하고, +1을 해서 5가 되었을때, 비로소 조건식을 만족하므로 종료

10.3. for loop

#!/bin/sh 
for val in {0..4}
do 
	echo $val 
done

11. 함수

#!/bin/sh 

#함수 작성
myFunction() {
	echo "my function"
}
myParamFunction() {
	echo "인수1: $1 인수2:$2"
}

# 함수 호출 
myFunction
myParamFunction hello world

  • 함수를 호출할때는 함수이름으로 호출한다.

실행결과

$./test.sh 
my function
인수1: hello 인수2:world