Oracle 22일차

수업 내용

[쉘 프로그래밍]

  1. 로긴쉘 :
  2. 서브쉘 :

변수의 사용

중괄호{} 사용하면 변수명 뒤에 나오는 문자열과 변수명을 구분할 수 있음
${변수명}_다른문자열 -> 가능

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

Leave a Comment