셸은 사용자가 입력한 명령을 해석해 커널로 전달하거나, 커널의 결과를 사용자에게 전달하는 역할을 한다.

셸 스크립트는 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

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다