Shell script

Shell에서 return문이 일반 언어에서의 return문과 다른 점

검정비니 2023. 12. 30. 20:30
728x90
반응형

DevOps 등의 목적으로 shell로 함수등을 만드는 경우가 많이 생기게 된다.

이렇게 함수로 코드를 짜게 된다면 "return"문을 사용하는 경우 역시 발생하게 된다.

 

사실 shell의 return은 일반 프로그래밍 언어에서 사용되는 return문과 근본적인 차이가 있는데, 바로 숫자 타입만 반환이 가능하다는 것이다.

 

예를 들어, 셸 스크립트로 문자열을 반환하는 함수를 짜게 되면 return문으로는 문제를 해결할 수가 없다.

반환할 문자열의 종류가 미리 정해져 있다면 프로그래밍 언어에서의 enum을 사용하는 것처럼 각 문자열을 미리 숫자 코드로 디자인해두고, 적절한 숫자값을 리턴하는 함수를 구현하면 된다.

만약, 이러한 방법론이 아니라 순수하게 문자열 자체를 반환해야 한다면 return이 아니라 echo 명령어를 사용하면 된다.

 

아래는 예제 코드들이다.

 

예제 1 (echo를 사용해서 문자열 반환)

lockdir="somedir"
testlock(){
    retval=""
    if mkdir "$lockdir"
    then # Directory did not exist, but it was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval="true"
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval="false"
    fi
    echo "$retval"
}

retval=$( testlock )
if [ "$retval" == "true" ]
then
     echo "directory not created"
else
     echo "directory already created"
fi

 

 

예제 2 (문자열들을 대응하는 숫자값으로 미리 정의하고, 숫자값을 반환)

lockdir="somedir"
testlock(){
    if mkdir "$lockdir"
    then # Directory did not exist, but was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval=0
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval=1
    fi
    return "$retval"
}

testlock
retval=$?
if [ "$retval" == 0 ]
then
     echo "directory not created"
else
     echo "directory already created"
fi

 

 

위의 echo를 활용한 문자열 반환 방식을 잘 활용하면 아래와 같이 실시간으로 서버 내의 리소스를 모니터링 할 수 있는 스크립트도 간단히 작성할 수 있게 된다.

#!/bin/bash

# Function to calculate CPU usage
calc_cpu_usage() {
    # Get the CPU usage percentage for each core
    usage=$(top -bn1 | grep '%Cpu' | awk '{print $2+$4}')

    # Calculate the average CPU usage
    num_cores=$(nproc)
    cpu_usage=$(echo "$usage / $num_cores" | bc)

    echo "$cpu_usage"
}

# Monitor RAM and CPU usage
while true; do
    # Get the total and used RAM
    ram_info=$(free -m | grep Mem)
    total_ram=$(echo $ram_info | awk '{print $2}')
    used_ram=$(echo $ram_info | awk '{print $3}')

    # Get the CPU usage
    cpu_usage=$(calc_cpu_usage)

    # Get the Disk usage
    disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')

    # Get the Network usage
    network_rx_usage=$(ifconfig ens5 | grep 'RX' | grep 'byte' | awk '{print $5}' | cut -d ':' -f 2)
    network_tx_usage=$(ifconfig ens5 | grep 'TX' | grep 'byte' | awk '{print $5}' | cut -d ':' -f 2)

    # Print the RAM and CPU usage
    #echo "RAM usage: $used_ram MB / $total_ram MB    CPU usage: $cpu_usage%"

    echo "RAM: $used_ram MB / $total_ram MB"
    echo "CPU: $cpu_usage%"
    echo "Disk: $disk_usage"
    echo "Network RX: $network_rx_usage"
    echo "Network TX: $network_tx_usage"
    echo "-----------------------------"

    # Wait for 1 second before checking again
    sleep 1
done

 

반응형

'Shell script' 카테고리의 다른 글

Bash에서 크롬을 종료시키는 방법  (0) 2022.04.07
Bash에서 node.js 종료시키는 방법  (0) 2022.04.07