수업 내용
[쉘 프로그래밍]
- 로긴쉘 :
- 서브쉘 :
변수의 사용
중괄호{} 사용하면 변수명 뒤에 나오는 문자열과 변수명을 구분할 수 있음
${변수명}_다른문자열 -> 가능
ex)
todate=$(date +%Y%m%d)
totime=$(date +%H%M%S)
echo “오늘의 날짜 : $todate, 현재 시간 : $totime”
종료코드
프로그램 종료 시 종료코드 선언
exit 0 : 정상
exit 1 : 비정상
exit 2 : 시스템에러
[논리 연산자]
and : -a 또는 &&
or : -o 또는 ||
not : !조건
ex)
fname=test.txt
fsize=100
if [ -f $fname -a $fsize -ge 100 ] <=> [ -f ]
[숫자 연산]
expr
정수 결과 리턴. 그리고 띄어쓰기에 굉장히 신경 잘 써야 됨!
#!/bin/sh
echo "덧셈할 두 수 입력1 : \c"
read num4
echo "입력2 : \c"
read num5
echo "나눌 수 입력 : \c"
read num6
res1=$(expr \( ${num4} + ${num5} \) / ${num6})
res2=$(expr \( ${num4} + ${num5} \) / ${num6} \* 10)
echo "(${num4} + ${num5}) / ${num6} = ${res1}"
echo "(${num4} + ${num5}) / ${num6} * 10 = ${res2}"
bc
정수, 실수 연산 가능
** 문법
bc 파일명
ex) echo 1 + 10 | bc
** 옵션
-l : 실수 리턴
[조건문 – case문]
case 대상 in
A)
명령어1
명령어2
;;
B)
명령어1
명령어2
;;
*)
명령어1
명령어2
;;
esac
[연습문제 12_test.sh]
파일명과 복사할 디렉토리명을 입력받고, 해당 파일과 디렉토리 존재유무 확인. 해당 파일을 복사할 때 기존 파일이 있으면 덮어쓸 지를 물은 뒤 처리
#!/bin/sh
echo "복사할 파일명 입력 : \c"
read fname
if [ -f $fname ]
then
echo "$fname 파일이 존재합니다"
echo "복사할 디렉토리명 입력 : \c"
read dname
if [ -d $dname ]
then
echo "$dname 디렉토리가 존재합니다"
if [ -f $dname/$fname ]
then
echo "같은 이름의 파일이 존재합니다. 덮어쓸까요?(y/n) \c"
read ans
case $ans in
Y|y)
cp $fname $dname
echo "$fname 파일이 $dname으로 복사되었습니다"
;;
N|n)
echo "$fname 파일을 복사하지 않겠습니다"
;;
*)
echo "잘못된 입력입니다"
exit 1
;;
esac
else
cp $fname $dname
echo "$fname 파일이 $dname으로 복사되었습니다"
exit 0
fi
else
echo "$dname 디렉토리가 존재하지 않습니다"
exit 1
fi
else
echo "$fname 파일이 존재하지 않습니다
exit 1
fi
exit 0
# 강사님 코드
#!/bin/sh
# 1. 파일명과 복사할 디렉토리 입력받기
echo "파일명을 입력하세요 : \c"
read fname
echo "디렉토리명을 입력하세요 : \c"
read dname
# 2. 파일과 디렉토리 존재 확인하기
if [ -f $fname ] && [ -d $dname ]
then
echo "사전확인 성공"
else
echo "사전확인 실패"
exit 1
fi
# 3. 복사할 디렉토리에 같은 이름 파일 확인하기
if [ -f $dname/$fname ]
then
echo "같은 이름의 파일이 있습니다. 덮어쓸까요?(Y|N) \c"
read ans
else
cp $fname $dname
echo "$fname 파일이 $dname 으로 복사되었습니다"
exit 0
fi
# 4. 같은이름 파일이 있으면 덮어쓸지 물어보기
case $ans in
[Yy]*)
cp $fname $dname
echo "$fname 파일이 $dname 으로 복사되었습니다"
;;
[Nn]*)
echo "$fname 파일을 복사하지 않겠습니다"
;;
*)
echo "잘못된 출력입니다"
exit 1
;;
esac
exit 0
[반복문 – for문]
반복되는 명령어 처리를 위해 수행
반복횟수나 반복대상 명확
** 문법
for 반복변수 in 대상
do
반복할 명령어
done
[연습문제 – 14_for2.sh]
#!/bin/sh
echo "출력1"
for i in a b c
do
echo $i
done
echo
echo "출력2"
for i in a b c
do
echo "$i\c"
done
echo
echo
echo "출력3"
echo "진행중입니다\c"
for i in . . .
do
echo "$i\c"
sleep 1
done
echo
[연습문제 – 15_for2.sh]
#!/bin/sh
vsum=0
i=1
while [ $i -le 100 ]
do
vsum=$(expr $vsum + $i)
i=$(expr $i + 1)
done
echo "1+2+...+100=$vsum"
itwill@ubuntu:~/linux_ex/ch9$ cat 15_for3.sh
#!/bin/sh
vsum=0
for i in $(seq 1 100)
do
vsum=$(expr $vsum + $i)
done
echo "1+2+...+100=$vsum"
[반복문 – while문]
반복되는 명령어 처리를 위해 수행
** 문법
while [ 조건 ]
do
반복할 명령어
done
[연습문제 – 16_while.sh]
#!/bin/sh
vsum=0
i=1
while [ $i -le 100 ]
do
vsum=$(expr $vsum + $i)
i=$(expr $i + 1)
done
echo "1+2+...+100=$vsum"
[연습문제 – 17_test.sh]
디렉토리명을 입력받고 하위 *sh 파일들에 대해 파일 사이즈를 확인하고 파일크기가 100이상인 파일들에 대해 백업디렉토리(~/linux_ex/backup)로 복사하고 복사한 시간을 함께 출력
#!/bin/sh
clear
# env
todate=$(date +%Y-%m-%d)
totime=$(date +%H:%M:%S)
backdir=/home/itwill/linux_ex/backup
# backup directory check
if [ ! -d $backdir ]
then
mkdir -p $backdir
fi
# main
echo "파일을 찾을 디렉토리를 입력하세요 : \c"
read dname
if [ -d $dname ]
then
echo "$dname 디렉토리가 존재합니다"
else
echo "$dname 디렉토리가 존재하지 않습니다"
exit 1
fi
find $dname -name "*.sh" > .filelist
for fname in $(cat .filelist)
do
fsize=`ls -l $fname | cut -d" " -f5`
if [ $fsize -ge 100 ]
then
echo "$fname 파일을 복사하겠습니다. $todate $totime"
cp $fname $backdir
else
echo "$fname 파일은 복사하지 않겠습니다"
fi
done
rm .filelist
exit 0