- 셸의 개념과 명령문 처리 방식을 이해한다.
- 셸 스크립트의 작성과 실행 방법을 익힌다.
- 다양한 문접을 활용하여 셸 스크립트를 작성한다.
# ls -l
# rm -rf /mydir
# find . / -name "*.conf"

I. sh 명령으로 실행
ex)

II. '실행 가능' 속성으로 변경한 후에 실행
ex)

myVar = Hello -- ❗ = 앞뒤에 공백이 있음
myVar=Hello
myVar=Yes Sir -- ❗ 값의 공백은 " "로 묵어야 함
myVar="Yes Sir"
myVar=7+5 -- ❗ "7+5" 라는 문자열로 인식
var1.sh
#!/bin/sh
myvar="Hi Woo"
echo $myvar -- 'Hi Woo' 출력
echo "$myvar" -- 'Hi Woo' 출력
echo '$myvar' -- ''로 묶어서 '$myvar' 출력
echo \$myvar -- 앞에 \를 넣어서 '$myvar' 출력
echo 값 입력 :
read myvar -- 변수 myvar에 키보드로 값(문자열) 입력
echo '$myvar' = $myvar -- '$myvar' -> $myvar 출력, $myvar -> myvar 변수 안의 문자열 출력
exit 0
결과

numcalc.sh
#!/bin/sh
num1=100
num2=$num1+200
echo $num2 -- 문자열로 취급하여 100+200을 출력
num3=`expr $num1 + 200` -- 숫자로 취급하여 계산하며 각 단어를 띄어쓰기 해야 함
echo $num3 -- 300 출력
num4=`expr \( $num1 + 200 \) / 10 \* 2` -- 괄호와 * 앞에는 \
echo $num4 -- 60 출력
exit 0
결과

paravar.sh
#!/bin/sh
echo "실행파일 이름은 <$0>이다" -- <$0> : paravar.sh
echo "첫번째 파라미터는 <$1>이고, 두번째 파라미터는 <$2>다" -- <$1> : 1번, <$2> : 2번
echo "전체 파라미터는 <$*>다" -- <$*> : 전체 파라미터 출력
exit 0
결과

[ 조건 ] 안의 각 단어 사이에 공백이 있어야 한다는 것을 주의해야 함
ex)
if1.sh
#!/bin/sh
if [ "cook" = "cook" ] -- 각 단어 사이 띄어쓰기
then
echo "참입니다" -- "" 안의 문자열 출력
fi
exit 0
결과

#!/bin/sh
if [ "cook" != "cook" ]
then
echo "참입니다"
else
echo "거짓입니다"
fi
exit 0
결과



#!/bin/sh
if [ 100 -eq 200 ] -- -eq : 두 수식(또는 변수)이 같으면 참
then
echo "100과 200은 같다."
else
echo "100과 200은 다르다."
fi
exit 0
결과


if4.sh
#!/bin/sh
fname=/lib/systemd/system/cron.service -- fname 변수에 cron 서버 실행 파일인 /lib/systemd/system/cron.service를 저장
if [ -f $fname ] -- fname 변수에 저장된 /lib/systemd/system/cron.service 파일이 일반 파일이면 참이므로 5행을 실행하고, 그렇지 않으면 거짓이므로 7행을 실행함
then
head -5 $fname -- 일반 파일 이기때문에 fname에 들어 있는 파일의 앞부분 다섯 행을 출력
else
echo "cron 서버가 설치되지 않았습니다."
fi
exit 0
결과

case1.sh
#!/bin/sh
case "$1" in -- 첫 번째 파라미터 변수(명령 실행 시 추가한 값 : sh case1.sh stop($1) )인 $1 값에 따라서 3행, 5행, 7행, 9행으로 분기
start)
echo "시작~~";; -- $1가 start면 실행. 끝에는 세미콜론 2개(;;)
stop)
echo "중지~~";;
restart)
echo "다시 시작~~";;
*) -- 정해진 경우의 수가 아닐경우 다음 구문을 실행
echo "뭔지 모름~~";;
esac
exit 0
결과

#!/bin/sh
echo "공부가 재미있나요? (yes / no)"
read answer -- answer 변수에 키보드로 값을 입력
case $answer in
yes | y | Y | Yes | YES) -- 입력된 값이 yes, y, Y, YES 중 하나이면 6~7행을 실행함
echo "다행입니다."
echo "더욱 열심히 하세요 ^^";; -- 실행할 구문의 끝이므로 ;; 넣음
[nN]*) -- 앞에 n 또는 N이 들어가는 모든 단어를 인정
echo "안타깝네요. ㅠㅠ";;
*)
echo "yes 아니면 no만 입력했어야죠"
exit 1;; -- 정상적인 종료가 아니므로 exit 1로 종료
esac
exit 0
결과

andor.sh
#!/bin/sh
echo "보고 싶은 파일명을 입력하세요."
read fname
if [ -f $fname ] && [ -s $fname ] -- 입력한 파일 이름이 일반 파일(-f)이고 크기가 0이 아니면(-s) 5행을 실행함.
then
head -5 $fname
else
echo "파일이 없거나, 크기가 0입니다."
fi
exit 0
for ~ in 문
for 변수 in 값1 값2 값3 ...
do
반복할 문장
done
ex)
forin1.sh
#i/bin/sh
hap=0 -- 합계를 누적할 hap 변수를 초기화
for i in 1 2 3 4 5 6 7 8 9 10 -- i 변수에 1~10을 넣어 5행을 열 번 실행함
do
hap=`expr $hap + $i` -- hap에 i 변수의 값을 누적
done
echo "1부터 10까지의 합: "$hap
exit 0
결과

ex)
forin2.sh
#!/bin/sh
for fname in $(ls *.sh) -- faname 변수에 ls *.sh 명령의 실행 결과를 하나씩 넣어 4~5행을 실행
do
echo "--------$fname--------" -- 스크립트 파일 이름을 출력
head -3 $fname -- 스크립트 파일의 앞부분 3행을 출력
done
exit 0
결과

while 문
#!/bin/sh
while [ 조건식 ]
do
반복할 문장
done
ex)
while1.sh
#!/bin/sh
while [ 1 ] -- 조건식 위치에 [ 1 ] 또는 [ : ]이 오면 항상 참이므로 4행을 무한 반복함
do
echo "우분투 18.04 LTS"
done
exit 0
결과

ex)
while2.sh
#!/bin/sh
hap=0 -- 합계를 누적할 hap 변수를 초기화
i=0 -- 1부터 10까지 증가하는 i 변수를 선어
while [ $i -le 10 ] -- i가 10보다 작거나 같으면 6~7행을 실행
do
hap=`expr $hap + $i` -- hap에 i 변수의 값을 누적
i=`expr $i + 1` -- i 변수의 값을 1씩 증가
done
echo "1부터 10 까지의 합 : $hap"
exit 0
결과

ex)
while3.sh
#!/bin/sh
echo "비밀번호를 입력하세요."
read mypass -- mypass 변수에 키보드로부터 값을 입력 받음
while [ $mypass != "1234" ] -- mypass 변수의 값이 '1234'가 아니면 6~7행을 실행
do
echo "틀렸음. 다시 입력하세요."
read mypass -- 다시 mypass 변수에 값을 입력 받음
done
echo "통과~~"
exit 0
until2.sh
#!/bin/sh
hap=0 -- 합계를 누적할 hap 변수를 초기화
i=0 -- 1부터 10까지 증가하는 i 변수를 선어
until [ $i -gt 10 ] -- i가 10보다 클 때 까지 실행
do
hap=`expr $hap + $i` -- hap에 i 변수의 값을 누적
i=`expr $i + 1` -- i 변수의 값을 1씩 증가
done
echo "1부터 10 까지의 합 : $hap"
exit 0
ex) while3를 until로 표현
until3.sh
#!/bin/sh
echo "비밀번호를 입력하세요."
read mypass -- mypass 변수에 키보드로부터 값을 입력 받음
until [ $mypass = "1234" ] -- mypass 변수의 값이 '1234'가 아니면 6~7행을 실행
do
echo "틀렸음. 다시 입력하세요."
read mypass -- 다시 mypass 변수에 값을 입력 받음
done
echo "통과~~"
exit 0
bce.sh
#!/bin/sh
echo "무한반복 입력을 시작합니다. (b: break, c: continue, e: exit)"
while [ 1 ] ; do -- 무한 반복(while [ : ] 또는 while [ true ]와 동일)
read input
case $input in -- 4행에서 입력한 값에 따라 분기
b | B) -- b 또는 B가 입력되면, 7행의 break를 실행(while문 종료, 16행 실행)
break;;
c | C) -- continue를 실행(3행의 while문으로 돌아감)
echo "continue를 누르면 while의 조건으로 돌아감"
continue;;
e | E) -- 12 ~ 13행의 exit를 실행
echo "exit를 누르면 프로그램(함수)을 완전히 종료함"
exit 1;;
esac;
done
echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨."
exit 0
사용자 정의 함수
함수명 () { -- 함수 정의
내용
}
함수명 -- 함수 호출
ex)
func1.sh
#!/bin/sh
myFunction () { -- 함수 정의
echo "함수 안으로 들어 왔음"
return
}
echo "프로그램을 시작합니다."
myFunction -- 함수 호출
echo "프로그램을 종료합니다."
exit 0
결과

함수의 파라미터 사용
함수명 () { -- 함수 정의
$1, $2, ... 등을 사용
}
함수명 파라미터1 파라미터2 ... -- 함수 호출
ex)
func2.sh
#!/bin/sh
hap () {
echo `expr $1 + $2` -- 넘겨받은 파라미터 $1과 $2fmf 더한 값을 출력
}
echo "10 더하기 20을 실행합니다"
hap 10 20 -- 넘겨줄 파라미터를 공백으로 분리하여 차례로 넣음
exit 0
결과

eval.sh
#!/bin/sh
str="ls -l eval.sh"
echo $str -- str 변수의 값인 'ls -l eval.sh'라는 글자를 그대로 출력
eval $str -- str 변수의 값인 'ls -l eval.sh'를 명령으로 인식하여 실행
exit 0
결과

exp1.sh
#!/bin/sh
echo $var1 -- var1 변수 출력, var1은 지역변수 이므로 가져오지 못함.
echo $var2 -- var2 변수 출력, var2은 외부변수 이므로 exp2.sh에서 가져옴.
exit 0
exp2.sh
#!/bin/sh
var1="지역 변수" -- var1은 지역변수
export var2="외부 변수" -- export를 사용하여 var2를 외부변수로 사용
sh exp1.sh -- exp1.sh 실행
exit 0
결과

printf.sh
#!/bin/sh
var1=200.5
var2="재미있는 비기너 우분투~~" -- 공백이 있으므로 " "로 묶음
printf "%5.2f \n\n \t %s \n" $var1 "$var2" -- %5.2f는 총 5자리, 소수점 아래 2자리까지 출력, \n 은 개행 문자, \t는 Tab 문자, %s는 문자열을 출력, $var2의 경우 값 중간에 공백이 있으므로 변수 이름을 " "로 묶음
exit
결과

set.sh
#!/bin/sh
echo "오늘 날짜는 $(date) 입니다." -- $(date)는 date 명령어를 실행한 결과
set $(date) -- $(date)의 결과가 파라미터 변수 $1, $2, $3, ...에 저장($1 : 2020., $2 : 06., $3 : 27., $4 : (토), $5 : 16:31:17, $6 : KST
echo "오늘은 $4 요일 입니다." -- 네 번째 파라미터($4)인 (토)을 출력
exit 0
결과

shift.sh
#!/bin/sh
myfunc() {
str="" -- 결과를 누적할 str 변수를 초기화
while [ "$1" != "" ]; do -- $1 파라미터가 비어 있지 않는 동안(while) 반복실행
str="$str $1" -- str 변수에 $1을 추가
shift -- 전체 파라미터를 왼쪽으로 시프트
done
echo $str -- while 문을 빠져나오면, 누적한 str 변수를 출력
}
myfunc AAA BBB CCC DDD EEE FFF GGG HHH JJJ KKK
exit 0
shift.sh
#!/bin/sh