if [ 조건식 ]
then
(조건식이 True일 경우 실행문)
else
(조건식이 False일 경우 실행문)
fi
여기에서 중요한 부분이 fi
이다.
위에서 보면 다른 프로그래밍 언어와는 달리 if() { }
의 구조가 아님을 알 수 있다.
즉, 쉘 스크립트는 if문의 종료 지점이 어디인지를 알 수가 없다.
따라서 쉘 스크립트에서는 fi
를 통해 if문의 종료 지점을 알려야 한다.
또한 다른 프로그래밍 언어에서 else구문이 선택이듯 쉘 스크립트에서도 then
은 필수이지만 else
는 필수가 아니다.
마지막으로 중요한 것이 있는데 if문 뒤에 띄어쓰기가 무조건 존재해야 하며, '[' 뒤와 ']' 앞에도 띄어쓰기가 무조건 존재해야 한다.
이전에 쉘 스크립트를 통한 파일 비교를 공부하다 찾은 재미있는 성질이 있어 정리했다.
if문에서 조건식을 [ ]
로 감싸는 것을 볼 수 있다.
그런데 Bash에서는 [
가 명령어로도 사용될 수 있다.
이것이 어떠한 의미냐면 True, False, 혹은 비교 연산자가 조건식으로 들어갈 경우 [ ]
로 감싸줘야 하는데, 사실이 [
가 명령어의 역할을 수행한다는 것이다.
반대로 조건식으로 들어가야 하는 값이 명령어라면 [ ]
로 감쌀 경우 [
명령어와 조건식 명령어 2개가 실행되기 때문에 에러가 발생할 것이다.
따라서 조건식으로 명령문을 쓰기 위해선 [ ]
를 사용하지 않아야 한다.
yes
, y
, Yes
, YES
: yes, y, Yes, YES가 입력되었으면 True
[nN]*
: 입력된 값의 맨 앞 자리 문자가 n이거나 N이면 True
"string1"="string2"
: 동일하면 True"string1"!="string2"
: 동일하지 않으면 True-n "string"
: "string"이 Null이 아니면 True-z "string"
: "string"이 Null이면 True형식은 아래와 같이 사용하면 된다.
[비교값1] (산술 비교 연산자) [비교값 2]
# 띄어쓰기가 사이에 존재한다는 것에 신경쓰자
-eq
: 같을 경우 True-ne
: 같지 않을 경우 True-gt
: 비교값1이 클 경우 참-ge
: 비교값1이 크거나 같을 경우 참-lt
: 비교값1이 작으면 참-le
: 비교값1이 작거나 같으면 참!
: 조건식 맨 앞에 붙을 경우 Not을 의미함추가로 이중 소괄호 안에서는 <
와 >
도 사용할 수 있다.
(("$a" < "$b"))
-d file-name
: file이 Directory면 True-e file-name
: file이 존재하면 True-f file-name
: file이 일반 파일이면 True-s file-name
: file size가 0이 아니면 참-r file-name
: file이 읽기 가능한 파일이면 True-w file-name
: file이 쓰기 가능한 파일이면 True-x file-name
: file이 실행 가능한 파일이면 TrueAnd와 Or의 사용 방법은 아래와 같다.
[조건식1] (And, or 연산자) [조건식2]
-a
, &&
: and-o
, ||
: orcase문은 다른 프로그래밍 언어의 Switch문과 동일한 역할을 수행한다.
switch문에서는 case
를 통해 상황을 분기하고 break
문을 추가하여 1개의 분기문만 실행되도록 하지만 쉘 스크립트의 case ~ esac문에서는 이런 과정이 필요 없다.
단순히 )
를 통해 상황을 분기해 주면 된다.
case 조건식 in
조건1)
(조건1이 True일 경우 실행문)
조건2)
(조건2가 True일 경우 실행문)
...
*)
(위에서 기입한 조건이 모두 False일 경우 실행문)
esac
# 방법 1 : for문 변수로 들어갈 값들을 리스트로 입력
for [변수] in [변수에 들어갈 값들]
do
[반복문에서 실행할 명령]
done
# 방법 2 : for문 변수로 들어갈 값들을 함수로 입력
for ((변수에 대한 함수))
do
[반복문에서 실행할 명령]
done
이렇게만 보면 잘 이해가 안가니 예시를 통해 자세히 알아보자.
# 방법 1 예시
for i in 1 2 3 4 5
do
sum=`expr $sum + $i`
done
# 방법 2 예시
for ((i=1;i<=5;i++))
do
sum=`expr $sum + $i`
done
추가로 {1..10..1}
문구를 통해 ((i=1;i<=10;i++))
을 대체할 수도 있다.
규격화시키자면 {초기값..마지막 값..증가하는 폭}
으로 생각할 수 있다.
while [조건식]
do
(조건식이 True일 경우 실행문)
done
다른 프로그래밍 언어의 while문처럼 조건식이 False가 될 때까지 계속 반복하여 명령문을 실행하는 함수이다.
for문 형식과 유사하므로 자세한 설명은 생략하겠다.
until [조건식]
do
(조건식이 False일 경우 실행문)
done
while문의 조건식에 !
가 붙었다고 생각하면 된다.
while문과는 다르게 조건식이 False일 때 계속 반복 실행되다가 조건식이 True가 됐을 때 반복문이 종료된다.
break
: 반복문을 종료하고 빠져나올 때 사용continue
: 반복문에서 조건식으로 돌아갈 때 사용exit
: 해당 프로그램을 완전히 종료return
: 함수 안에서 사용되어 함수를 호출한 곳으로 돌아갈 때 사용exit
이라는 쉘 스크립트 실행을 완전히 종료하는 명령이 추가된 것을 제외하면 다른 프로그래밍 언어와 유사함을 볼 수 있다.
문자열을 명령문으로 인식하여 실행하는 명령문이다.
eval문은 다른 프로그래밍 언어에서는 보기 힘든 명령이기 때문에 예시를 통해 파악해 보자.
str="ls -l | tail -5"
echo $str
eval $str
exit 0
명령문이 실행되었음을 확인할 수 있다.
다른 프로그램에서도 사용 가능한 외부 변수를 선언하는 명령문이다.
변수 선언 구문 앞에 export
만 붙여주면 된다.
C언어의 printf와 매우 유사하며 형식을 지정하여 출력하기 위한 명령문이다.
C언어에서는 형식과 출력할 값을 ( )
로 묶었지만 쉘 스크립트에서는 형식만 " "로 묶는다는 차이가 존재한다.
printf "형식" 데이터
%d
: 정수형%f
: 실수형%s
: String형$(command)
는 명령문(command)의 실행 결과를 사용한다는 것을 의미하며 set
은 결과를 파라미터로써 이용한다는 것을 의미한다.
set
으로 설정한 Parameter들은 $n
을 사용하여 n번째 파라미터 값을 사용할 수 있다.
예시 코드를 통해 알아보자.
echo "오늘은 $(date)"
set $(date)
echo "오늘은 $4 요일이다"
exit 0
파라미터가 10개가 넘을 때 주로 사용되는 명령문이다.
shift
명령은 Command의 Parameter들을 위치지정 매개변수에 할당한 뒤 왼쪽으로 이동시키는 역할을 가지고 있다.
이때 0번째 매개변수는 shift에 영향을 받지 않는다.
그리고 이동이 완료되었다면 명령줄을 벗어난 인수들은 분실되며 다시 사용할 수 없게 된다.
조금 설명이 어려운데, 예를 들어 Paremter로써 a1, a2, a3, a4가 입력되었다고 가정하자.
이 때 shift 2가 실행될 경우 Parameter들이 왼쪽으로 2칸씩 이동할 것이다.
이 경우 a1과 a2는 명령줄을 벗어나므로 없어지고 a3, a4만 인식 가능해지는 것이다.
예시를 통해 확인해 보자.
#!/bin/bash
echo "Parmameters : $*"
shift 2
echo "After Shift : $*"
shift 2
echo "After Shift Twice : $*"
exit 0
사용자가 직접 만드는 쉘 함수이다.
Function을 만드는 법은 간단하다.
[함수이름] () {
[함수에서 실행할 명령들]
return
}
사실 User-defined Function에서 중요한 것은 함수를 만드는 과정보다는 Parameter를 주입하는 과정이다.
함수를 사용할 때 myfunction()
과 같이 활용하기보다는 myfunction(3, 4)
처럼 연산을 위한 Parmeter를 주입해 주는 것이 일반적이기 때문이다.
User-Defined Function에서는 $n
을 통해 입력한 n번째 Parameter를 사용할 수 있다.
또한 User-Deinfed Function을 사용할 때는 [함수이름] 값1 값2 값3
의 형식으로 사용할 수 있다.
2개의 값을 더하는 함수인 mysum을 만든 뒤 실행까지 시키는 쉘 스크립트를 통해 파악해 보자.
#!/bin/bash
mysum(){
echo `expr $1 + $2`
}
echo "123 + 456은?"
mysum 123 456
exit 0