2 minute read

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

Categories:

Updated: