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