Oracle 21일차

수업 내용

[Shell]

Shell의 종류

bourne shell : .sh, 기초가 되는 shell
korn shell : .ksh, bourne shell 과의 호환성 유지, history, alias 기능 제공
C shell : .csh, C언어와 유사
bash shell : .bash, 리눅스의 기본 shell, bourne shell 과 호환성 유지
dash shell : .dash, 우분투에서 사용

로그인쉘 과 서브쉘

로그인쉘 : command 창에서 해석하는 쉘
grep 사용자이름 /etc/passwd 명령어 사용해서 무슨 쉘이 로그인쉘인지 확인할 수 있다.

서브쉘 : 프롬프트에서 다른쉘을 실행할 수 있는데 이를 서브쉘이라 함.

[변수 선언]

변수 : 어떤 상수나 실행 결과를 담기 위해 선언하는 객체.

** 변수 선언
변수명=상수
변수명=”문자열”
변수명=$명령어
변수명=`명령어`

** 변수 호출
$변수명
echo $변수명

ex)
itwill@ubuntu:~/linux_ex/ch2$ $var1
test…: command not found
itwill@ubuntu:~/linux_ex/ch2$ echo $var1
test…

[cut]

문자열 추출을 위한 명령어

** 문법
cut 옵션 파일명

** 옵션
-b : byte씩 추출
-c : character씩 추출
-d : 분리구분기호 전달
-f : 추출할 필드번호

예)
echo abcde | cut -b1-3 -> abc
echo abcde | cut -c1 -> a

[read]

사용자에게 값의 입력을 요구할 때 사용

** 문법
read 변수명

[연습문제]

1_cut.sh
사용자에게 유저명을 입력받고 해당 유저의 홈디렉토리 출력

#!/bin/sh

echo -n "유저명을 입력하세요: "
read username

vhome=$(grep -w ^$username /etc/passwd | cut -d: -f6)

echo "$username 의 홈디렉토리는 $vhome 입니다"

2_ls.sh
파일명을 입력받고 해당 파일에 대한 파일크기 출력

#!/bin/sh

echo -n "파일명 입력 : "
read filename

vfile=$(ls -l $filename | cut -d" " -f5)

echo "$filename 의 파일사이즈는 $vfile 입니다"

[if문]

** 문법
if [ 조건 ] # 조건 대신 명령어 전달 시 [] 생략
then
else
fi

if [ 조건 ]
then
elif [ 조건 ]
then
else
fi

** 조건
-eq : equal
-ne : not equal
-gt : greater than
-ge : greater than or equal
-lt : less than
-le : less than or equal
! : 반전
-n : NULL이 아니면 참
-z : NULL이면 참
-f : 파일이면 참
-d : 디렉터리면 참
-s : 파일크기가 0이 아니면(빈파일이 아니면) 참

[연습문제]

3_if1.sh
파일이 존재하는지 아닌지 체크 후
파일 사이즈가 500보다 큰 경우, 작은 경우

#!/bin/sh

echo -n "파일명 입력 : "
read filename

if [ -f $filename ]
then
        echo "$filename 파일이 존재합니다"
        size=$(ls -l $filename | cut -d" " -f5)

        echo "$filename 의 파일사이즈는 $size 입니다"

        if [ $size -gt 500 ]
        then
                echo "큰 파일입니다"
        else
                echo "작은 파일입니다"
        fi
else
        echo "$filename 파일은 존재하지 않습니다"
fi

4_if2.sh
유저가 있는지 없는지 체크하고, 있다면 유저의 홈디렉토리와 로그인쉘을 출력
grep을 바로 if문에 넣는 경우 대괄호가 필요없다. (비교연산자가 없어서)
/dev/null은 빈 파일. grep의 결과를 화면에 출력시키지 않기 위해서 사용

#!/bin/sh

echo -n "유저명을 입력하세요: "
read username

if grep -w ^$username /etc/passwd > /dev/null
then
  echo "$username유저가 존재합니다"
  vhome=$(grep -w ^$username /etc/passwd | cut -d: -f6)
  vshell=$(grep -w ^$username /etc/passwd | cut -d: -f7)
  echo "유저명 : $username"
  echo "홈디렉토리 : $vhome"
  echo "로그인쉘 : $vshell"
else
  echo "$username유저가 존재하지 않습니다"
fi

5_if3.sh
디렉토리명을 입력받고 있으면 디렉토리 소유자 출력, 없으면 디렉토리 새로 생성

#!/bin/sh

echo -n "디렉토리명을 입력하세요: "
read dirname

if [ -d $dirname ]
then
  echo "$dirname이 존재합니다"
  username=$(ls -ld $dirname | cut -d" " -f3)
  echo "소유자명 : $username"
else
  echo "$dirname이 존재하지 않습니다"
  mkdir $dirname
  echo "mkdir $dirname"
fi

[wc]

‘라인수 단어수 글자수 파일명’ 출력

** 문법
wc [옵션] 파일명

** 옵션
-l : 라인수, 파일명
-w : 단어수, 파일명
-c : 글자수, 파일명

[연습문제]

6_if4.sh
파일명을 입력받고 파일명이 존재할 경우 파일 라인수가 50라인 이상인 경우 해당 파일을 백업 디렉토리로 복사
단, 백업디렉토리는 ~/linux_ex/backup

#!/bin/sh

echo -n "파일명을 입력하세요: "
read filename

if [ -f $filename ]
then
  echo "$filename이 존재합니다"
  if [ $(cat $filename | wc -l) -ge 50 ]
  then
    cp $filename /home/itwill/linux_ex/backup
    echo "50라인이상이어서 복사"
  else
    echo "50라인미만이어서 복사 안 함"
  fi
else
  echo "$filename이 존재하지 않습니다"
fi

7_test1.sh
유저명을 입력받고 유저가 존재하면 유저의 홈디렉토리로 이동하여 testfile.txt 라는 빈파일을 생성

#!/bin/sh

echo -n "유저명을 입력하세요: "
read uname

if grep -w $uname /etc/passwd > /dev/null
then
  echo "$uname이 존재합니다"
  cd $(grep -w itwill /etc/passwd | cut -d: -f6)
  touch testfile.txt
  echo "testfile.txt 파일 생성완료"
else
  echo "$uname이 존재하지 않습니다"
fi

--강사님 방법 (여러 번 쓰이니깐 변수home으로 선언해버리기)
#!/bin/sh

echo -n "유저명을 입력하세요: "
read uname

if grep -w $uname /etc/passwd > /dev/null
then
  echo "$uname이 존재합니다"
  home=$(grep -w ^$uname /etc/passwd | cut -d: -f6)
  cd $home
  touch testfile.txt
  ls $home
  echo "testfile.txt 파일 생성완료"
else
  echo "$uname이 존재하지 않습니다"
fi

8_test2.sh
디렉토리명과 파일명을 차례대로 입력받고 해당 디렉토리에 있는 파일 목록 출력

아 이건 좀 어렵다... 내일 풀이나 들어야지~

#!/bin/sh
clear

echo -n "파일을 찾을 디렉토리명을 입력하세요: "
read dname

if [ -d $dname ]
then
  echo "$dname 디렉토리가 존재합니다"
  echo -n "찾을 파일명을 입력하세요: "
  read fname
  find $dname -type f -name "*$fname*" > find.txt
  fnum=$(cat find.txt | wc -l)
  echo
  echo "찾을 위치 : $dname"
  echo "파일명 : $fname"
  echo "찾은 파일 수 : $fnum"
  echo "최종 파일 목록"
  cat find.txt
else
  echo "$dname이 존재하지 않습니다"
fi

Leave a Comment