셸은 사용자가 입력한 명령을 해석해 커널로 전달하거나, 커널의 결과를 사용자에게 전달하는 역할을 한다.
셸 스크립트는 C 언어와 유사한 방법으로 프로그래밍 할 수 있는데, 리눅스가 애초에 C언어 기반 OS이기 때문이다. 셸 스크립트도 일반 프로그래밍 언어처럼 변수, 반복문, 제어문 등을 사용할 수 있다.
셸 스크립트는 주로 vi나 gedit으로 사용하는 편이다.
간단한 셸 스크립트 작성과 실행
vi name.sh 명령으로 간단한 셀 스크립트를 작성해보자
#!/bin/sh
echo "사용자 이름: " $USER
echo "홈 디렉토리: " $HOME
exit 0
[centos@localhost ~]$ sh name.sh
사용자 이름: centos
홈 디렉토리: /home/centos
따로 실행가능 속성으로 변경 후 실행
‘실행 가능’으로 변경한 후 ./(스크립트파일) 명령으로 실행한다.
[centos@localhost ~]$ chmod +x name.sh
[centos@localhost ~]$ ls -l *.sh
-rwxrwxr-x 1 centos centos 81 3월 19 15:50 name.sh
[centos@localhost ~]$ ./name.sh
사용자 이름: centos
홈 디렉토리: /home/centos

변수
셸 스크립트에서는 변수를 사용하기 전 미리 선언치 않는다. 처음 변수에 값이 할당되면 자동으로 변수가 생성된다.
모든 값은 문자열로 취급한다.
대소문자를 구분한다.
= 좌우에 공백이 없어야 한다.
[centos@localhost ~]$ testval = hello
bash: testval: 명령을 찾을 수 없습니다...
[centos@localhost ~]$ testval=hello
[centos@localhost ~]$ echo $testval
hello
[centos@localhost ~]$vi var1.sh
#!/bin/sh
myvar="Hi Woo"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
echo 값 입력:
read myvar
echo '$myvar'=myvar
exit 0
실행
[centos@localhost ~]$ sh var1.sh
Hi Woo
Hi Woo
$myvar
$myvar
값 입력:
jungsoonho
$myvar=jungsoonho
숫자 계산
#!/bin/sh
num1=100
num2=$num1+200
echo $num2
num3='expr $num1 + 200'
echo num3
num4=`expr \( $num1 + 200 \) / 10 \* 2`
echo $num4
exit 0
실행
[centos@localhost ~]$ sh numcalc.sh
100+200
num3
60
파라미터 변수
파라미터 변수는 $0, $1, $2 등의 형태를 갖는다. 이는 실행하는 명령의 부분 하나하나를 변수로 지정한다는 의미다.
paravar.sh
#!/bin/sh
echo "실행파일 이름은 <$0>이다"
echo "첫 번째 파라미터는 <$1>이고, 두 번째 파라미터는 <$2>다."
echo "전체 파라미터는 <$*>다"
exit 0
실행
[centos@localhost ~]$ sh paravar.sh
실행파일 이름은 <paravar.sh>이다
첫 번째 파라미터는 <>이고, 두 번째 파라미터는 <>다.
전체 파라미터는 <>다
if문과 case문
if문을 살펴보자. 기본 문법은 다음과 같다
if[조건]
then
참일 경우 실행
fi
if1.shs
if1.sh
#!/bin/sh
if [ "woo" = "woo" ]
then
echo "참입니다"
fi
exit 0
실행
[centos@localhost ~]$ sh if1.sh
참입니다
If-else문
참인 경우와 거짓인 경우를 구분해 실행한다.
형식은 다음과 같다.
If [조건]
then
참인 경우
else
거짓인 경우
fi
if2.sh
#!/bin/sh
if [ "woo" = "woo" ]
then
echo "참입니다"
else
echo "거짓입니다"
fi
exit 0
비교 연산자
문자1 = 문자2 # 문자1 과 문자2가 일치 (sql같이 = 하나만 써도 일치로 인식)
문자1 == 문자2 # 문자1 과 문자2가 일치
문자1 != 문자2 # 문자1 과 문자2가 일치하지 않음
-z 문자 # 문자가 null 이면 참
-n 문자 # 문자가 null 이 아니면 참
문자 == 패턴 # 문자열이 패턴과 일치
문자 != 패턴 # 문자열이 패턴과 일치하지 않음
값1 -eq 값2 # 값이 같음(equal)
값1 -ne 값2 # 값이 같지 않음(not equal)
값1 -lt 값2 # 값1이 값2보다 작음(less than)
값1 -le 값2 # 값1이 값2보다 작거나 같음(less or equal)
값1 -gt 값2 # 값1이 값2보다 큼(greater than)
값1 -ge 값2 # 값1이 값2보다 크거나 같음(greater or equal)
if3.sh
if3.sh
#!/bin/sh
if [ 100 -eq 200 ]
then
echo "100은 200과 같다"
else
echo "100은 200과 다르다"
fi
exit 0
case~esac문
C나 JAVA의 swich, case문과 같다고 생각하면 된다.
case1.sh
!/bin/sh
case1.sh
#!/bin/sh
case "restart" in
start)
echo "시작~~";;
stop)
echo "중지~~";;
restart)
echo "재시작~~";;
*)
echo "출력 불가"
esac
exit 0
실행
[centos@localhost ~]$ sh case1.sh
재시작~~
AND, OR 관계 연산자
쉘 스크립트에서의 AND 연산자는 &&, OR 연산자는 ||를 사용한다.
andor.sh
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then
head -5 $fname
else
echo "파일이 없거나, 크기가 0 입니다."
fi
exit 0
반복문
forin.sh
!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
hap=expr $hap + $i
done
echo “1부터 10까지의 함 : $hap”
exit 0
실행
[centos@localhost ~]$ sh forin1.sh
“1부터 10까지의 합 : 55”
현재 디렉터리에 있는 셸 스크립트 파일 (*.sh)의 파일 이름과 앞 3줄을 출력하는 프로그램이다.
#!/bin/sh
for fname in $(ls *.sh)
do
echo "-----$fname-----"
head -3 $fname
done
exit 0
[centos@localhost ~]$ sh forin2.sh

while 문
#!/bin/sh
hap=0
i=0
while [ $i -le 10 ]
do
hap=`expr $hap + $i`
i=`expr $i + 1`
done
echo "1부터 10까지의 합 : $hap"
exit 0
[centos@localhost ~]$ sh while.sh
1부터 10까지의 합 : 55
while2.sh
#!/bin/sh
echo "비밀번호를 입력하세요"
read mypass
while [ $mypass != "1234" ]
do
echo "틀렸음. 다시 입력하세요."
read mypass
done
echo "통과~~"
exit 0
[centos@localhost ~]$ sh while2.sh
비밀번호를 입력하세요
1234
통과~~
until 문
while 문과 용도가 거의 같지만, until 문은 조건식이 참일 때 까지(=거짓인 동안) 계속 반복한다. while2.sh를 동일한 용도로 until문으로 바꾸려면 4행을 다음과 같이 바꾼다.
until [ $i -gt 10 ]
break, continue, exit, return
break : 반복문 종료 / continue : 반복문의 조건식으로 돌아가기 / exit : 해당 프로그램 완전 종료 / return : 함수 안에서 사용될 수 있고, 함수를 호출한 곳으로 돌아가게 한다
#!/bin/sh
echo "무한 반복 입력을 시작합니다. (b: break, c: continue, e: exit)"
while [ 1 ] ; do
read input
case $input in
b | B)
break;;
c | C)
echo "continue는 while문의 조건으로 돌아감"
continue;;
e | E)
echo "exit를 누르면 프로그램(함수)를 완전히 종료함"
exit 1;;
esac;
done
echo "break를 누르면 이 문장이 출력된다"
exit 0
