여러 개의 if else를 포함하는 if 문

여러 개의 if else를 포함하는 if 문

스크립트를 사용하여 컴퓨터 그룹의 컴퓨터 이름과 고정 IP 주소를 설정하는 스크립트를 생성하려고 하는데, 실행할 때 파일 끝 오류가 발생합니다. 다음은 스크립트의 작은 예입니다.

#!/bin/sh
serial=`/usr/sbin/system_profiler SPHardwareDataType | /usr/bin/awk '/Serial\ Number\ \(system\)/ {print $NF}'`

if test "$serial" == "C07M802Z4E825DY3J"
then
    scutil --set ComputerName "qa-mac-1"
    scutil --set LocalHostName "qa-mac-1"

    networksetup -setproxyautodiscovery "Ethernet" on
    networksetup -setmanual Ethernet 10.1.1.1 255.255.255.128 10.1.1.129
    networksetup -setdnsservers Ethernet 10.2.76.98 10.2.76.97
    networksetup -setsearchdomains Ethernet mycompany.com mycompanycorp.com us.mycompany.com
else
    if test "$serial" == "C07M803JDLSY3J"
    then
        scutil --set ComputerName "qa-mac-2"
        scutil --set LocalHostName "qa-mac-2"

        networksetup -setproxyautodiscovery "Ethernet" on
        networksetup -setmanual Ethernet 10.1.1.2 255.255.255.128 10.1.1.129
        networksetup -setdnsservers Ethernet 10.2.76.98 10.2.76.97
        networksetup -setsearchdomains Ethernet mycompany.com mycompanycorp.com us.mycompany.com

        if test "$serial" == "C0737951JDLSY3J"
        then
            scutil --set ComputerName "qa-mac-3"
            scutil --set LocalHostName "qa-mac-3"

            networksetup -setproxyautodiscovery "Ethernet" on
            networksetup -setmanual Ethernet 10.1.1.2 255.255.255.128 10.1.1.129
            networksetup -setdnsservers Ethernet 10.2.76.98 10.2.76.97
            networksetup -setsearchdomains Ethernet mycompany.com mycompanycorp.com us.mycompany.com
        fi

        exit 0

답변1

작성된 대로 스크립트에는 코드 중복이 많아 상황이 변경될 때 사용하기가 어렵습니다. if/ elsevs if/ 외에도 elif다음 부분을 처리하는 코드를 조건부로 작성하는 것이 좋습니다.다른그리고 다른 모든 작업을 한 번에 수행하십시오.

스크립트를 빠르게 스캔한 결과, 일련 번호 간에 다른 점은 호스트 이름과 IP 주소뿐이었습니다. 이를 고려하면 스크립트는 다음과 같을 수 있습니다.

#!/bin/sh

# I tried to minimize the changes to your original to avoid distracting from the
# point I was trying to make, but alas...
# This is functionally equivalent to what you had originally.
serial="$(/usr/sbin/system_profiler SPHardwareDataType | /usr/bin/awk '/Serial Number \(system\)/ {print $NF}')"
name=""
address=""

if [ "${serial}" = "C07M802Z4E825DY3J" ]; then
    name="qa-mac-1"
    address="10.1.1.1"
elif [ "${serial}" = "C07M803JDLSY3J" ]; then
    name="qa-mac-2"
    address="10.1.1.2"
elif [ "${serial}" = "C0737951JDLSY3J" ]; then
    name="qa-mac-3"
    address="10.1.1.3" # You had 10.1.1.2 here, I'm guessing it should have been .3
else
    echo "Serial ${serial} is unsupported"
    exit 1
fi

scutil --set ComputerName "${name}"
scutil --set LocalHostName "${name}"

networksetup -setproxyautodiscovery "Ethernet" on
networksetup -setmanual Ethernet "${address}" 255.255.255.128 10.1.1.129
networksetup -setdnsservers Ethernet 10.2.76.98 10.2.76.97
networksetup -setsearchdomains Ethernet mycompany.com mycompanycorp.com us.mycompany.com

답변2

if/then/elif... 부분의 경우 CASE를 대신 사용해 볼 수 있습니다.

bash에서도 작동합니다.

#!/bin/sh
...
case $serial in
   "C07M802Z4E825DY3J")
      name="qa-mac-1"
      address="10.1.1.1"
      ;;
   "C07M803JDLSY3J")
      name="qa-mac-2"
      address="10.1.1.2"
      ;;
   "C0737951JDLSY3J")
      name="qa-mac-3"
      address="10.1.1.3"
      ;;
   \?) # incorrect option
      echo "Error: Invalid option"
      exit;;
esac

관련 정보