[유닉스 이론과 실습] 13장 연습문제
01. 다음과 같이 스크립트에 명령행 인자를 지정하여 실행하였다. $0이 출력하는 값이 무엇인가?
$ out_script 10 20 30
① out_script
② 10
③ 20
④ 10 20 30
정답 : ① out_script
▶ $0 : 현재 셸 스크립트의 이름
02. 다음과 같은 인용부호를 사용한 경우 무엇이 출력되는가?
$ echo "'`date''"
① 'date'
② date
③ '2019년 05월 19일 일요일 오후 9시 23분 39초 KST'
④ 2019년 05월 19일 일요일 오후 9시 23분 39초 KST
정답 : ③ '2019년 05월 19일 일요일 오후 9시 23분 39초 KST'
03. 다음과 같이 실행할 경우 무엇이 출력되는가?
$x=10
$x=$x*2
$echo $x
① 10
② 20
③ $x*2
④ 10*2
정답 : ④ 10*2
04. 파일이 존재하는지 확인하기 위한 스크립트를 작성하려고 한다. 어떤 코드를 사용해야 하는가?
① if [[ -f $file ]]
② if [[ -e $file ]]
③ if (( -f $file ))
④ if (( -e $file ))
정답 : ② if [[ -e $file ]]
▶ if [[ ]] : 내장명령 [[ ]] 사용
▶ -f file : 파일은 존재하지만 디렉토리는 존재하지 않음
▶ -e file : 파일이 존재
05. 함수의 리턴값을 받아 출력하려고 한다. 리턴값은 어디에 저장되는가?
① $0
② $1
③ $x
④ $?
정답 : ④ $?
▶ 함수의 리턴값은 $?에 저장된다.
06. 다음 연산식의 실행 결과와 종료 값을 확인해 표를 채우시오.(단, a=2, b=4, c=8)
연산식 | 결과 값 | 종료 값 |
3 * 5 / 4 | ||
a >> 2 | ||
a ^ b | ||
a < 2 && c > 5 |
정답 :
연산식 | 결과 값 | 종료 값 |
3 * 5 / 4 | ||
a >> 2 | ||
a ^ b | ||
a < 2 && c > 5 |
07. 변수의 값이 "path=/export/home/user1/.profile"일 때 주어진 문자열 처리 결과 값을 적으시오.
º ${path%/user1*}
º ${path##*/}
정답 : /export/home
.profile
▶ ${variable%pattern} : variable 값 뒤부터 패턴과 일치하는 가장 작은 부분을 찾아 제거
▶ ${variable%%pattern} : variable 값 뒤부터 패턴과 일치하는 가장 큰 부분을 찾아 제거
▶ ${variable#pattern} : variable 값 앞부터 패턴과 일치하는 가장 작은 부분을 찾아 제거
▶ ${variable##pattern} : variable 값 앞부터 패턴과 일치하는 가장 큰 부분을 찾아 제거
08. 두 파일의 이름을 인자로 받아 다음과 같이 복사하는 스크립트를 작성하시오. 단, my_cp1은 cp 명령을 사용해 스크립트 안에서 파일 내용을 복사하고, my_cp2는 cp 명령 대신 파일 내용을 직접 읽어서 복사하시오.
˙ 파일명 : my_cp
˙ 동작 예 :
$ my_cp . file (오류 체크)
첫 번째 인자는 일반 파일이어야 합니다.
$ my_cp file1 file2 (file1을 file2로 복사)
$ my_cp file1 dir1 (file1을 dir1 아래로 복사)
$ my_cp file1
사용 방법 : my_cp 파일명 파일명 또는 my_cp 파일명 디렉토리명
정답 :
#!/bin/bash
#
# my_cp1
#
file1=$1
file2=$2
if [[ ! -f $file1 ]]
then
echo "first parameter is normal file."
eilf [[ -f $file1 && -f $file2 ]]
then
cp $file1 $file2
elif [[ -f $file1 && -d $file2 ]]
then
cp $file1 $file2
else
echo "error"
fi
#!/bin/bash
#
# my_cp2
#
file1=$1
file2=$2
if [[ ! -f $file1 ]]
then
echo "first parameter is normal file."
elif [[ -f $file1 && -f $file2 ]]
then
cat $1 > $2
elif [[ -f $file1 && -d $file2 ]]
then
cat $1 > $2/$1
else
echo "error"
fi
09. 파일 조건 테스트 명령을 이용해 인자로 주어진 파일의 종류를 출력하는 스크립트를 작성하시오.
˙ 파일명 : my_file
˙ 동작 예 :
$ my_file test_file
test_file : 일반 파일입니다.
$ my_file /bin
/bin : 심볼릭 링크 파일입니다.
$ my_file /dev/dsk/c0t0d0s0
/dev/dsk/c0t0d0s0 : 블록 장치 특수 파일입니다.
정답 :
#!/bin/bash
#
# my_file
#
if [[ -f $1 ]]
then
echo "$1 : normal file"
elif [[ -L $1 ]]
then
echo "$1 : symbolic link file"
elif [[ -b $1 ]]
then
echo "$1 : block device file"
else
echo "error"
fi
10. 포지션 인자가 무엇인지 확인해보자. 스크립트에서 다음을 먼저 실행하도록 하고, 각 질문을 수행하도록 스크립트를 작성하시오.
˙ 파일명 : my_pos
˙ 포지션 인자 : set unix cook book hanbit
1) 전체 포지션 인자들을 출력하시오.
2) 포지션 인자의 개수를 출력하시오.
3) unix가 저장된 포지션 인자는 무엇인가?
정답 :
#!/bin/bash
#
# my_pos
#
echo "total parametars of position : "$@""
echo "the number of parametar of position : $#"
if [[ $1 == 'unix' ]]
then
echo "'unix' position is \$1"
elif [[ $2 == 'unix' ]]
then
echo "'unix' position is \$2"
elif [[ $3 == 'unix' ]]
then
echo "'unix' position is \$3"
elif [[ $4 == 'unix' ]]
then
echo "'unix' position is \$4"
elif [[ $5 == 'unix' ]]
then
echo "'unix' position is \$5"
else
echo "error"
fi
▶ $# : 전체 포지션 인자 개수
▶ "$@" : "$1", "$2", "$3"를 의미하며 각각 독립적인 문자열로 취급됨
11. set 명령으로 다음과 같이 date 명령을 실행하여 포지션 인자들에 값을 위치시키고, 포지션 인자를 사용하여 다음과 같은 형태로 출력이 되도록 스크립트를 작성하시오.
˙ 파일명 : my_date
˙ set : set $(date)
˙ 출력 형태 : 연도 월 일 요일
정답 :
#!/bin/bash
#
# my_date
#
set $(date)
echo "$6 $2 $3 $1"
12. 사용자를 등록하는 기능을 구현하려고 한다. 우선 사용자가 원하는 ID를 입력받아 현재 시스템에 등록된 ID인지 /etc/passwd 파일을 검색하여 사용할 수 있는지 여부를 알려주는 스크립트를 작성하시오.
˙ 파일명 : my_checkid
˙ 입력 : 사용자ID
˙ 출력 : You can use XXX, or Already exists( XXX) .
정답 :
#!/bin/bash
#
# my_checkid
#
a='cat /etc/passwd | grep $1 | wc -l'
if [[ $a == 1 ]]
then
echo "Already exists ($1)"
else
echo "You can use $1"
fi
13. 다음과 같은 명령의 목록을 출력하고 해당 명령의 번호를 선택하여 실행하도록 하는 스크립트를 작성하시오. quit를 선택하면 스크립트는 종료된다.
˙ 파일명 : my_menu
˙ 입력 : 1) pwd
2) who
3) ps
4) ls
5) quit
정답 :
#!/bin/bash
#
# my_menu
#
PS3="Input command(1~5): "
select cmd in pwd who ps ls quit # pwd=1, who=2, ps=3, ls=4, quit=5
do
case $cmd in
pwd) pwd ;;
who) who ;;
ps) ps ;;
ls) ls ;;
quit) break ;;
*) echo "Invalid input, select" ;;
esac
REPLY=-1 # null
done