Linux 2주차 시험 : bash 셸 프로그래밍 01
(문제) 아래 코드에서 “pseudo code … : …“로 쓰여있는 3개의 의사코드를 bash 셸 문법으로 작성하여 함수를 완성하라.
#!/bin/bash
if [ "$(type -t pathmunge)" != 'function' ]; then
unset pathmunge
pathmunge () {
"pseudo code #1 : 입력된 인수의 개수가 2개가 아니라면 1을 리턴"
"pseudo code #2 : 1번 인수가 디렉터리가 아니면 에러로 2를 리턴"
case ":${PATH}:" in
*:"$1":*)
;;
*)
"pseudo code #3 :
2번 인수의 값이 insert 라면 PATH 환경 변수의 맨 앞에 1번째 인수를 추가하고,
append라면 PATH의 맨 뒤에 1번 인수를 추가한다.
그 외의 값이라면 3을 리턴한다."
esac
}
fi
export PATH=/usr/bin:/usr/sbin
echo $PATH
pathmunge /usr/local/sbin insert
pathmunge /usr/local/bin insert
echo $PATH
pathmunge /etc/profile after
pathmunge /bin append
pathmunge /sbin append
pathmunge /opt/mxmware_v12
pathmunge /opt/studio/bin
echo $PATH
- 함수를 완성한 뒤 실행하면 아래 3행의 결과가 나와야 한다. 아래 실행은 셸 스크립트 파일명을 final_01.sh로 간주했을 때이다.
$ bash final_01.sh
/usr/bin:/usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
풀이
#!/bin/bash
if [ "$(type -t pathmunge)" != 'function' ]; then
unset pathmunge
pathmunge () {
# "pseudo code #1 : 입력된 인수의 개수가 2개가 아니라면 1을 리턴"
[ $# -ne 2 ] && return 1
# "pseudo code #2 : 1번 인수가 디렉터리가 아니면 에러로 2를 리턴"
[ ! -d $1 ] && return 2
case ":${PATH}:" in
*:"$1":*)
;;
*)
# "pseudo code #3 :
# 2번 인수의 값이 insert 라면 PATH 환경 변수의 맨 앞에 1번째 인수를 추가하고,
# append라면 PATH의 맨 뒤에 1번 인수를 추가한다.
# 그 외의 값이라면 3을 리턴한다."
if [ $2 == "insert" ]; then
PATH=$1:${PATH}
elif [ $2 == "append" ]; then
PATH=${PATH}:$1
else
return 3
fi
esac
}
fi
export PATH=/usr/bin:/usr/sbin
echo $PATH
pathmunge /usr/local/sbin insert
pathmunge /usr/local/bin insert
echo $PATH
pathmunge /etc/profile after
pathmunge /bin append
pathmunge /sbin append
pathmunge /opt/mxmware_v12
pathmunge /opt/studio/bin
echo $PATH
Linux 2주차 시험 : bash 셸 프로그래밍 02
(문제) 아래 코드에서 “pseudo code … : …“로 쓰여있는 3개의 의사코드를 bash 셸 문법으로 작성하여 함수를 완성하라.
#!/bin/bash
serverlist=( '127.0.0.1,cron.service'
'127.0.0.1,amongus.service' '127.0.0.1,NetworkManager.service'
'127.0.0.1,dbus.service' '127.0.0.1,fallguys.service' )
"pseudo code #1 : serverlist 배열의 개수가 0개라면 1을 리턴"
for srv in ${serverlist[@]}; do
unit_name=${srv#*,}
systemctl is-active $unit_name -q 2>/dev/null
"pseudo code #2 : srvlist_return[${#srvlist_return[@]}] 변수에 이전 명령어의 exit code(==return code)를 저장한다."
done
# RESULT (0:active, Otherwise:inactive,unknown)"
typeset -i n_err
typeset -i ii
"pseudo code #3 : for 루프를 작성하되, serverlist의 배열 개수만큼 반복하도록 한다."
do
if [ ${srvlist_return[${ii}]} -ne 0 ]; then
echo -e "\e[31m${srvlist_return[${ii}]} : ${serverlist[${ii}]}\e[m"
let n_err++
else
echo "${srvlist_return[${ii}]} : ${serverlist[${ii}]}"
fi
done
echo $n_err
- 코드를 완성한 뒤 실행하면 아래와 같이 6행의 결과가 나와야 한다. 아래 실행은 셸 스크립트 파일명을 final_02.sh 간주 했을 때이다.
$ bash final_02.sh
0 : 127.0.0.1,cron.service
3 : 127.0.0.1,amongus.service
0 : 127.0.0.1,NetworkManager.service
0 : 127.0.0.1,dbus.service
3 : 127.0.0.1,fallguys.service
2
문제 풀이
#!/bin/bash
serverlist=( '127.0.0.1,cron.service'
'127.0.0.1,amongus.service' '127.0.0.1,NetworkManager.service'
'127.0.0.1,dbus.service' '127.0.0.1,fallguys.service' )
# "pseudo code #1 : serverlist 배열의 개수가 0개라면 1을 리턴"
if [ ${#serverlist[*]} -eq 0 ]; then
return 1
fi
for srv in ${serverlist[@]}; do
unit_name=${srv#*,}
systemctl is-active $unit_name -q 2>/dev/null
srvlist_return[${#srvlist_return[@]}]=$?
# "pseudo code #2 : srvlist_return[${#srvlist_return[@]}] 변수에 이전 명령어의 exit code(==return code)를 저장한다."
done
# RESULT (0:active, Otherwise:inactive,unknown)"
typeset -i n_err
typeset -i ii
n_err=0
# "pseudo code #3 : for 루프를 작성하되, serverlist의 배열 개수만큼 반복하도록 한다."
for (( ii=0; ii<${#serverlist[*]}; ii++ )); do
if [ ${srvlist_return[${ii}]} -ne 0 ]; then
echo -e "\e[31m${srvlist_return[${ii}]} : ${serverlist[${ii}]}\e[m"
let n_err++
else
echo "${srvlist_return[${ii}]} : ${serverlist[${ii}]}"
fi
done
echo $n_err