7장. 셸 스크립트 프로그래밍 (2) - 셸 스크립트 프로그래밍 문법

728x90
반응형

출처 : https://www.youtube.com/watch?v=OYly7irfmBc&list=PLVsNizTWUw7FqN2gq79Cb3R6qkS7mqOJk&index=46

 

변수의 입력과 출력

  • $ 문자가 들어간 글자를 출력하려면 ' '로 묶어주거나 앞에 \를 붙여야 한다.
  • " "로 변수를 묶어줘도 된다.
#!/bin/sh
myvar="Hi Woo"
yourvar="Hi Zang"
echo $myvar 1
echo "$yourvar 2"
echo '$myvar 3'
echo \$yourvar 4
echo 값 입력:
read myvar
echo '$myvar'=$myvar
exit 0

 

 

  • $myvar 과 "$yourvar" 는 변수의 내용이 출력된다.
  • '$myvar'와 \$yourvar 는 변수명이 문자열 그대로 출력된다.
  • read 실행문을 쓰면 myvar에 내가 입력한 값이 저장이 된다.

 

숫자 계산

  • 변수에 대입된 값은 모두 문자열로 취급
  • 변수에 들어있는 값을 숫자로 해서 +, -, *, / 등의 연산을 하려면 expr을 사용
  • 수식에 괄호 또는 곱하기(*)는 그 앞에 꼭 역슬래쉬(\)를 붙임
#!/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

 

주의해야 할 것은 ' '가 아니라 ` `를 써야한다.

  • num2는 expr을 사용하지 않아 문자열 취급을 해서 100+200이 출력된다.
  • num3는 expr을 사용해 연산을 하여 300이 출력된다.
  • num4는 expr을 사용하고 괄호를 먼저 계산하여 300 / 10 * 2 = 60 이 된다.

 

파라미터 변수

  • 파라미터 변수는 $0, $1, $2 ... 의 형태를 가진다.
  • 실행하는 명령의 부분 하나하나를 변수로 지정한다는 의미이다.
  • 전체 파라미터는 $* 로 표현한다.
#!/bin/sh
echo "실행파일 이름은 <$0>이다."
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>이다."
echo "전체 파라미터는 <$*>이다."
exit 0

 

 

  • sh paravar.sh 파라미터1 파라미터2 를 입력한다.
  • $0는 파일 이름 이 된다.
  • $1이 파라미터1 이 된다.
  • $2가 파라미터2 가 된다.
  • $* 전체 파라미터를 출력한다.

 

조건문

기본 if 문

기본적으로 if문의 기본 문법은 다음과 같다.

if [ 조건 ]
then
	참일 경우 실행
fi

 

조건문에서 주의해야 할 점은 '[ 조건 ]' 사이의 각 단어에는 모두 공백이 있어야 한다.

 

#!/bin/sh
if [ "woo" = "woo" ]
then
 echo "참입니다."
fi
exit 0

 

 

if ~ else 문

if else 문의 기본 문법은 다음과 같다.

if [ 조건 ]
then
 참일 경우 실행
else
 거짓일 경우 실행
fi

 

#!/bin/sh
if [ "woo" = "zang" ]
then
 echo "참입니다."
else
 echo "거짓입니다."
fi
exit 0

 

 

woo와 zang은 다르므로 else 조건의 거짓입니다. 가 출력된다.

 

 

조건문에 들어가는 비교 연산자

비교 연산자는 문자열 비교 연산자와 산술 연산자가 있다.

 

문자열 비교 연산자
산술 비교 연산자

#!/bin/sh
if [ 100 -eq 200 ]
then
 echo "100과 200은 같다."
else
 echo "100과 200은 다르다."
fi
exit 0

 

 

 

파일과 관련된 조건

 

 

#!/bin/sh
fname=/lib/systemd/system/sshd.service
if [ -f $fname ]
then
 head -5 $fname
else
 echo "sshd 서버가 설치되지 않았습니다."
fi
exit 0

 

  • fname 변수에 httpd 서버 실행 파일을 저장
  • fname 변수에 저장된 파일은 일반 파일이므로 참이된다. 그러므로 fname에 들어있는 파일의 앞 5줄을 출력하게 된다.

 

case ~ esac 

  • if 문은 참과 거짓 두 경우만 사용 가능 (이중분기)
  • 여러 가지 경우의 수가 있다면 case 문 (다중분기)
  • 각 조건의 결과 마지막에는 ;; 이 들어가야 한다.
  • case 문을 종료할 때는 case를 거꾸로 쓴 esac을 써준다.
#!/bin/sh
case "$1" in
 start)
  echo "시작~~";;
 stop)
  echo "중지~~";;
 restart)
  echo "다시 시작~~";;
 *)
  echo "뭔지 모름~~";;
esac
exit 0

 

 

$1 파라미터 변수가 무엇인지에 따라 출력값이 변하게 된다.

 

#!/bin/sh
echo "리눅스가 재미있나요? (yes / no)"
read answer
case $answer in
 yes | y | Y | Yes | YES)
  echo "다행입니다."
  echo "더 열심히 하세요 ^^";;
 [nN]*)
  echo "안타깝네요. ㅠㅠ";;
 *)
  echo "yes 아니면 no 만 입력해주세요"
  exit 1;;
esac
exit 0

 

  • answer라는 변수에 입력한 값을 받는다.
  • 입력된 값이 yes, y, Y, Yes, YES 중에 하나면 해당 조건문의 결과를 출력한다. 실행할 구문이 더 있으면 ;;을 붙이지 않는다.
  • 앞에 n, N이 들어가는 모든 단어를 다 인정한다는 의미다. 아래 조건문을 붙인다.
  • 그 외에 결과는 yes 아니면 no 만 입력해달라고 한다.
  • 정상적인 종료가 아니므로 exit 1로 종료한다.

 

 

 

AND, OR 관계 연산자

  • and는 '-a' 또는 '&&'를 사용
  • or는 '-o'  또는 '||'를 사용
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then
	head -5 $fname
else
	echo "파일이 없거나, 크기가 0입니다."
fi
exit 0

 

  • 입력한 파일이 일반 파일이면서 크기가 0 이 아니면 위에서 5줄 출력하고, 아니면 "파일이 없거나, 크기가 0입니다"를 출력한다.

 

반복문

 

for~in 문

  • 변수에 각각의 값을 넣은 후 do 안에 있는 '반복할 문장'을 실행한다. 값의 갯수만큼 반복 실행된다.
  • 형식
for 변수 in 값1 값2 값3 ...
do
	반복할 문장
done

 

#!/bin/sh
hap=0
for i in `seq 1 10`
do
 hap=`expr $hap + $i`
done
echo "1부터 10까지의 합: "$hap
exit 0

 

hap이라는 변수의 초기값은 0으로 두고 1~10까지 반복문으로 hap에 더한다.

최종적으로 55 라는 결과값을 출력한다.

 

 

#!/bin/sh
for fname in $( ls *.sh )
do
	echo "------$fname-------"
	head -3 $fname
done
exit 0

 

현재 디렉토리에 있는 셸 스크립트 파일(*.sh)의 파일명과 앞 3줄을 출력하는 프로그램이다.

 

 

 

while 문

  • 조건식이 참인 동안 계속 반복
  • [ 1 ] 또는 [ : ]가 오면 항상 참이 됨. 그러므로 4행을 무한 루프로 반복한다.
  • Ctrl + c 를 누르면 실행이 취소된다.
#!/bin/sh
while [ : ]
do
	echo "록키 리눅스 9"
done
exit 0

 

 

  • 1에서 10까지의 합계를 출력
#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]
do
	hap=`expr $hap + $i`
	i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0

 

 

  • 비밀번호를 입력받고, 비밀번호가 맞을 때까지 계속 입력받는 스크립트
#!/bin/sh
echo "비밀번호를 입력하세요."
read mypass
while [ $mypass != '1234' ]
do
	echo "틀렸습니다. 다시 입력하세요."
	read mypass
done
echo "맞았습니다."
exit 0

 

 

until 문

  • while 문과 용도가 거의 같지만, until 문은 조건식이 참일 때까지(=거짓인 동안) 계속 반복한다.
  • while2.sh를 동일한 용도로 until 문으로 바꾸려면 4행을 다음과 같이 바꾸면 된다
until [ $i -gt 10 ]

 

#!/bin/sh
hap=0
i=1
until [ $i -gt 10 ]
do
	hap=`expr $hap + $i`
	i=`expr $i + 1`
done
echo "1부터 10까지의 합 : "$hap
exit 0

 

 

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를 누르면 while을 빠져나와 지금 이 문장이 출력됩니다."
exit 0

 

 

 

사용자 정의 함수

  • 사용자가 직접 함수를 작성하고 호출할 수 있다.
  • 형식
함수이름 () {
	내용들...
}
함수이름

 

#!/bin/sh
myFunction() {
	echo "함수 안으로 들어왔음"
	return
}
echo "프로그램을 시작합니다."
myFunction
echo "프로그램을 종료합니다."
exit 0

 

 

 

함수의 파라미터 사용

  • 함수를 호출할 때 뒤에 파라미터를 붙이면 된다.
  • 함수 안에 $1, $2, ... 과 같은 형식으로 사용하면 된다.
  • 형식
함수이름 () {
	$1, $2, ... 등을 사용
}
함수이름 파라미터1 파라미터2 ...

 

#!/bin/sh
hap() {
	echo `expr $1 + $2`
}
echo "더할 변수를 입력하세요."
read fn sn
echo $fn "더하기" $sn"을 실행합니다."
hap $fn $sn
exit 0

 

 

 

eval

  • 문자열을 명령문으로 인식하고 실행
#!/bin/sh
str="ls -l eval.sh"
echo $str
eval $str
exit 0

 

  • echo는 str 변수의 값인 ls -l eval.sh를 출력한다.
  • eval은 str 변수의 값인 ls -l eval.sh를 명령으로 인식하고 실행한다.

 

 

export

  • 특정 변수를 외부 변수로 선언해준다.
  • 선언한 변수를 다른 프로그램에서도 사용할 수 있도록 해준다.
#!/bin/sh
echo $var1
echo $var2
exit 0
#!/bin/sh
var1="지역 변수"
export var2="외부 변수"
sh exp1.sh
exit 0

 

  • var2는 외부 변수로 선언해주어서, 외부 프로그램(exp1.sh)에서도 사용이 가능해진다.

 

 

printf

  • C언어의 printf() 함수와 비슷하게 형식을 지정해서 출력
#!/bin/sh
var1=100.5
var2="재미있는 리눅스"
printf "%5.2f \n\n \t %s \n" $var1 "$var2"
exit

 

  • %5.2f 하면 실수형으로 5자리까지 소수점은 2자리까지 출력하라는 의미이다.
  • \n은 한줄을 넘기라는 의미이며, 2개가 있으므로 2줄을 넘긴다.
  • \t는 Tab키를 한 번 하라는 의미이며, 들여쓰기가 된다.
  • %s는 문자열을 출력하라는 의미이다.
  • $var1이 %5.2f 자리에 들어가고, $var2가 %s 자리에 들어가게 된다.
  • $var2의 경우 값 중간에 공백이 들어가므로 " "로 묶어야 오류가 나지 않는다.

 

 

set과 $(명령)

  • 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
  • 결과를 파라미터로 사용하고자 할 때는 set과 함께 사용
#!/bin/sh
echo "오늘 날씨는 $(date) 입니다."
set $(date)
echo "오늘은 $4 요일 입니다."
exit 0
  • $(date)를 하면 date 명령을 실행한 결과인 년. 월. 일. 요일. 시간이 나온다.
  • set을 하면 $(date)의 결과를 $1, $2, $3 ... 등의 파라미터 변수에 저장한다.
  • $4를 하면 4번째 변수인 현재 요일을 출력하게 된다.

 

 

shift

  • 파라미터 변수를 왼쪽으로 한 단계씩 이동시킨다.
#!/bin/sh
myfunc() {
	str=""
	while [ "$1" != "" ] ; do
		str="$str $1"
		shift
	done
	echo $str
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
exit 0

 

  • 3행 : 결과를 누적할 변수 str를 초기화 한다.
  • 4행 : $1 파라미터가 비어있지 않은 동안에 반복 실행한다. 처음 $1은 AAA고 한 번 반복 실행하면 5, 6 행에 의해 $1이 BBB가 된다.
  • 5행 : str 변수에 $1을 추가한다.
  • 6행 : 전체 파라미터를 왼쪽으로 쉬프트시킨다. 즉, $2 -> $1, $3 -> $2, $4 -> $3, ... 의 형태로 이동된다.
  • 8행 : while 문이 끝나면 누적한 str 변수를 출력한다.

 

 

 

728x90
반응형