[Linux] shell script programming 1
programming/os

[Linux] shell script programming 1

13. shell script programming 1

본 포스팅은 2부작으로 내용이 구성되어 있습니다.


13.1 Shell Script


13.1.1 shell

사용자와 시스템 간의 대화형 프로그램

bash - Bourne-again shell(본 어게인 쉘, Bourne shell을 좀더 발전시킨 shell)


13.1.2 shell script

shell에서 실행되도록 작성된 프로그램

컴파일 단계가 없으므로 터미널에서 빠른 실행이 가능함

복잡한 쉘 스크립트는 각 명령어의 하위 프로세스에 따라 속도가 느려질 수 있음.

shell script의 확장자는 sh로 작성(shell의 약자)

윈도우즈의 bat 파일(일괄실행파일)과 비슷한 역할을 함


13.2 실습예제


13.2.1 기본 문법

gedit name.sh


# 주석(/bin/sh을 사용, 즉 bash를 사용하겠다는 의미)

# !/bin/sh

# 사용자 출력

echo "name: " $USERNAME

# 호스트 출력

echo "host: " $HOSTNAME

# 정상종료(0이 아니면 비정상종료)

exit 0


sh 프로그램은 bash에 대한 심볼릭 링크

ls -la /bin/sh

lrwxrwxrwx. 1 root root 4    2월 28 00:07 /bin/sh → bash

첫문자 l은 Link 파일임을 나타냄


ls -la name.sh

-rw-r--r--. 1 root root 79    12월 27 10:43 name.sh


-/d : 디렉토리 여부

rw- : 현재 사용자의 권한

r-- : 그룹 사용자의 권한

r-- : 기타 사용자의 권한


실행권한이 없어도 bash를 사용하여 실행할 수 있음

sh name.sh


bash를 사용하지 않고 직접 실행할 경우 실행 권한이 없으므로 에러가 발생함

./name.sh


파일의 권한을 수정(read 4, write 2, execute 1)

7 : read+write+execute    현재 사용자

5 : read+execute            현재 그룹

5 : read+execute            기타 사용자


사용 권한 부여 후 실행

chmod 755 name.sh


./name.sh




13.2.2 변수의 입력과 출력

변수를 미리 선언하지 않음

모든 변수는 문자열로 처리됨

\$ → $문자 출력

큰따옴표 안의 변수는 변수에 저장된 값

"$a" → a 변수에 저장된 값

작은따옴표 안에 작성된 내용은 그대로 출력됨

'$a' → $a

\$는 $를 의미함

\$a → $a


gedit var1.sh


#!/bin/sh

myvar = "Hi"

echo $myvar

echo "$myvar"

echo '$myvar'

echo \$myvar

echo "input: "

read myvar

echo "myvar =" $myvar    # 문자열 +가 없음에 주의

exit 0


sh var1.sh


사용권한 부여 후 실행

chmod 755 var1.sh


./var1.sh



13.2.3 숫자 계산

쉘 스크립트의 변수값은 스트링으로 처리됨

스트링을 숫자로 변환하려면 `expr 변수`로 처리(역따옴표)

\( → ( 문자

\* → 곱하기 연산자

변수 좌우에는 공백이 없어야 함

num1 = 100 에러 → num1=100

num2 = $num1 + 200 에러 → num2=$num1+200


gedit numcalc.sh


#!/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


sh numcalc.sh



13.2.4 파라미터 변수(명령행 매개변수)

자바의 String[] args에 해당되는 변수

public static void main(String[] args)


yum -y install jdk

$0   $1 $2     $3

$* → 모든 파라미터 출력(파일이름 제외)


gedit paravar.sh


#!/bin/sh

echo "file name : $0"

echo "param 1 : $1, param 2 : $2"

echo $*

exit 0


sh paravar.sh 100 200



13.2.5 조건식

if [조건]

then

true일 때의 식

else

false일 때의 식

fi


if[조건] 공백이 없으면 에러가 발생하므로 주의


gedit if1.sh


#!/bin/sh

if [ "woo" = "www" ]

then

echo "true"

elif [ "woo" = "waa" ]

then

echo "false"

else

echo "other"

fi

exit 0


sh if1.sh


또는 권한 부여 후 실행



13.2.6 조건 연산자

A -eq B : equal

A -ne B : not equal

A -gt B : Greater Than, A > B

A -ge B : Grater or Equal, A >= B

A -lt B : Less Than, A < B

A -le B : Less or Equal, A <= B

!A : not A


gedit if2.sh


#!/bin/sh

if [ 100 -eq 200 ]

then

echo "equal"

else

echo "not equal"

fi

exit 0


sh if2.sh


사용권한 부여 후 실행

chmod 755 if2.sh


./if2.sh


13.2.7 파일의 옵션

-f 일반파일이면 true

-d 디렉토리이면 true

-e(exist) 파일이 존재하면 true

-r 읽기가능한 파일이면 true

-w 쓰기가능한 파일이면 true

-x 실행가능한 파일이면 true


gedit if3.sh


#!/bin/sh

fname=/lib/systemd/system/httpd.service

if [ -f $fname ]

then

head -5 $fname

else

echo "not installed"

fi

exit 0


파일 내용 확인

cat /lib/systemd/system/httpd.service


끝부분 5줄 확인

tail -5 /lib/systemd/system/httpd.service


sh if3.sh



13.2.8 case 문

case ~ esac

케이스)    케이스의 끝(break) 세미콜론 2개 ;;

*) → default


gedit case1.sh


#!/bin/sh

case "$1" in

start)

echo "start...";;

stop)

echo "stop...";;

restart)

echo "restart...";;

*)

echo "unknown...";;

esac

exit 0


chmod 755 case1.sh


./case1.sh aaaaa