#!/bin/sh
if [ -d $1 ]; thencd $1
##### Example 1. Test Operator
if [ -f $2 ]; then
echo $2' is file.'
printf $2' is file.'\\n > $1/$2
else
echo $2' is not file.'
touch $1/$2
printf $2' file is created.'\\n > $1/$2
fi
##### Example 2. Arithmetic Comparison Operator
if [ $3 -gt 1 ]; then
echo $3' is greater than 1.'
printf $3' is greater than 1.'\\n >> $1/$2
elif [ $3 -eq 1 ]; then
echo $3' is equal to 1.'
printf $3' is equal to 1.'\\n >> $1/$2
else
echo $3' is less than 1.'
printf $3' is less than 1.'\\n >> $1/$2
fi
##### Example 3. String Comparison Operator
if [ $4 == "BMW" -o $5 == "Martiz" ]; then
if [ $4 == "BMW" ]; then
echo $4' is very expensive car.'
printf $4' is very expensive car.'\\n >> $1/$2
fi
if [ $5 == "Martiz" ]; then
echo $5' is twins transformer.'
printf $5' is twins transformer.'\\n >> $1/$2
fi
else
echo 'Both '$4' and '$5' are not mine.'
printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2
fi
fi
위와 같이 Shell Script를 작성하니 조금 복잡해 보이긴 하지만 50줄도 안되는 아주 간단한 예제입니다.
스크립트에 문단이라는 국어적 표현이 맞을지 모르나, 문단별로 나누어서 설명 드리도록 하겠습니다.
먼저 위 예제 스크립트는 외부로부터 변수를 받아 처리하기 위해 스크립트 내부적으로『 위치 매개변수($1, $2, $3, ..) 』를 사용하고 있습니다.
그리고 제일 첫 번째 라인은 해당 Shell Script 파일을 어떤 Shell로 처리할 것인지를 선언하는 부분입니다.
#!/bin/sh
다들 아시겠지만 Shell에는 bash, ksh, csh, tcsh 등 여러 종류가 있는데, 해당 OS에서 사용 가능한 Shell 이 어떤 것들이 있는지를 확인해 보고 싶다면 bin 디렉토리로 이동하여 다음과 같은 명령어를 수행시켜 보면 됩니다.
# ls *sh*
또한, 현재 접속한 터미널에서 사용하는 기본 Shell이 무엇인지 확인하려면, 다음의 명령어를 수행합니다.
# echo $SHELL
저의 예제는 ksh 또는 bash Shell 기준으로 만들어졌습니다.
이렇게 선언부를 간단히 처리하고 본격적인 Shell Script를 작성하시면 됩니다.
1) 첫 번째 문단
cd $1 // 해당 디렉토리로 이동
##### Example 1. Test Operator // 주석
if [ -f $2 ]; then // 두 번째 매개변수값이 파일이라면,
echo $2' is file.' // '$2 is file.' 이라는 문장을 echo 한다.
printf $2' is file.'\\n > $1/$2 // '$2 is file.' 이라는 문장을 $1 디렉토리 밑에 $2 파일에 printf 하고 줄바꿈(\n: 개행문자)한다.
else // 두 번째 매개변수값이 파일이 아니라면,
echo $2' is not file.' // '$2 is not file.' 이라는 문장을 echo 한다.
touch $1/$2 // $1 디렉토리 밑에 $2 파일을 만든다.
printf $2' file is created.'\\n > $1/$2 // '$2 file is created.' 라는 문장을 $2 파일에 printf 하고 줄바꿈(\\n) 한다.
fi
라인별 설명은 위 내용을 참조하시면 되겠고,
결국 위 구문을 말로 풀어내자면,
첫 번째 매개변수값에 해당하는 디렉토리($1)가 존재하면 change directory하고 output으로 생성할 파일($2)이 있는지 확인한 후(없으면 만들고), 조건식의 true 여부에 따라 각각에 해당하는 문장을 echo 및 printf 하겠다는 것입니다.
별로 어렵지 않죠?
위 구문 중 touch 명령 라인은 굳이 사용하지 않아도 바로 밑 라인의 '>(redirection)' command 에 의해 자동 파일 생성하게 됩니다.
echo나 printf 구문 뒤에는 위와 같이 문자열 등이 올 수 있는데, 문자열은 반드시 '(single quotation) 나 "(double quotation)로 wrap 해 주셔야 하며, 위치 매개변수의 경우엔 quotation 바깥에 명시해 주어야만 실제 매개변수값을 전달받을 수 있습니다.(echo $2' is file.')
2) 두 번째 문단
if [ $3 -gt 1 ]; then
echo $3' is greater than 1.'
printf $3' is greater than 1.'\\n >> $1/$2
elif [ $3 -eq 1 ]; then
echo $3' is equal to 1.'
printf $3' is equal to 1.'\\n >> $1/$2
else
echo $3' is less than 1.'
printf $3' is less than 1.'\\n >> $1/$2
fi
두 번째 문단에서 주의 깊게 살펴 보셔야할 부분은 elif 구문 뒤에 조건식이 들어간다는 것입니다.(지난 글에서는 언급이 없었네요.;;)
elif 구문이 else if 구문과 같으므로 당연히 조건식이 들어가야만 하겠죠.(조건식이 없어도 되는 것은 else 뿐입니다.)
3) 세 번째 문단
##### Example 3. String Comparison Operator
if [ $4 == "BMW" -o $5 == "Martiz" ]; then
if [ $4 == "BMW" ]; then
echo $4' is very expensive car.'
printf $4' is very expensive car.'\\n >> $1/$2
fi
if [ $5 == "Martiz" ]; then
echo $5' is twins transformer.'
printf $5' is twins transformer.'\\n >> $1/$2
fi
else
echo 'Both '$4' and '$5' are not mine.'
printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2
fi
세 번째 문단은 문자열 비교 예시로써, 앞서 제가 올린 글들을 잘 읽어 보셨다면 역시 별 무리 없이 이해하실 수 있을 것입니다.
위 문단에서 한 가지 언급 드리고 싶은 것은 문자열 비교 시에 대소문자를 구분한다는 것입니다.
만일 네 번째 위치 매개변수의 값으로 'bmw' 라는 소문자 문자열이 입력되었다면, 위 문단의 두 번째 조건식($4 == "BMW")에서 false 를 리턴하겠죠.
이제 이렇게 작성된 스크립트를 실행시키려면, 사용자가 로그인한 바로 그 계정에서 해당 스크립트에 대한 실행 권한이 있어야 합니다.
즉, vi 편집기로 위와 같이 작성 완료한 후에 스크립트 실행 전, 다음과 같이 모드를 변경해 주어야 합니다.
# ls -l IfTest.sh
-rwxr-xr-x 1 root root 1185 Aug 9 16:52 IfTest.sh
권한이나 모드 변경에 대한 것은 이 글을 읽고 있는 분들께서 사전에 알고 계실 것이라 믿고 설명을 생략하도록 하겠습니다.
위와 같이 하였다면 이제 다음과 같이 인자를 주고 실행시킨 후, 결과가 잘 나오는지를 확인하면 됩니다.
./IfTest.sh /opt IfTestResult.txt 0 bmw Martiz
이상으로 if문을 포함하는 Shell Script에 대하여 예시를 통해 한 번 알아보았습니다.
'3. OS이야기 > 03. Shell Script' 카테고리의 다른 글
[UNIX/LINUX] Shell Script 기본 - 2.기본 문법 (3) 배열 (0) | 2014.04.24 |
---|---|
[UNIX/LINUX] Shell Script 기본 - 2.기본 문법 (1) 변수 할당, (2) 수치 계산 (0) | 2014.04.22 |
[UNIX/LINUX] Shell Script 기본 - 1.if문 (3) 논리 연산자 (0) | 2014.04.18 |
[UNIX/LINUX] Shell Script 기본 - 1.if문 (2) 테스트 연산자 (0) | 2014.04.17 |
[UNIX/LINUX] Shell Script 기본 - 1.if문 (1) 기본 사용법 (0) | 2014.04.17 |