수업 내용
[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