Оператор If со многими if else

Чтобы это работало с относительными путями, потребуется следующее:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

Предполагается, что вы используете достаточно современный дистрибутив Linux, который содержит утилиту 'realpath'. (RHEL 6, например, не поддерживает ). Если доступен Perl, 'realpath' можно смоделировать, используя:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\"). \"\\n\";"
}
0
07.07.2020, 00:50
2 ответа

Ваш сценарий в том виде, в каком он написан, содержит множество дублирующихся кодов, с которыми будет трудно работать, когда что-то изменится. Помимо if/ elseпротив 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
5
18.03.2021, 23:21

Что касается части 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
4
18.03.2021, 23:21

Теги

Похожие вопросы