Как использовать возвращаемое значение команды Bash, например «ifconfig», в качестве аргумента для оператора if в скрипте Bash

Как использовать возвращаемое значение команды Bash, например «ifconfig», в качестве аргумента для оператора if в скрипте Bash

Я относительно новичок в написании скриптов на Bash, но я хорошо знаком с Python и многими командами Bash. Мне было интересно, можно ли использовать команду, например, ifconfig eno1и использовать вывод в качестве условия для использования в ifоператоре. В принципе, если вы выполните:

 ifconfig eno1

и вы получаете активный IP, есть ли способ сохранить вывод этого в переменной как 1/0 или true/false, чтобы использовать в следующем ifпримере оператора (предполагается, ifoutputчто это имя переменной):

 if [ "$ifoutput" == "$True"]

 then 
         echo connection is active! 
 fi

Я думал о том, чтобы вызвать скрипт Python, который делает по сути то же самое, однако я думал, что столкнусь с той же проблемой: невозможно получить индивидуальное возвращаемое значение из скрипта Python для использования в операторе if. Пожалуйста, дайте совет и, пожалуйста, будьте снисходительны ко мне — как я уже сказал, я относительно новичок в написании скриптов Bash! У меня уже есть методы сделать это строго с помощью Python, однако я пытаюсь узнать больше о написании скриптов Bash. Заранее спасибо!

решение1

ifconfigвернет числовое 8-битное значение после завершения (как любой процесс *nix, который завершается корректно).

Обычно ноль ( 0) используется для указания на успех, а другое значение используется для указания на неудачу. Этот код возврата доступен как $?.

ifconfigтакже выведет stdout, например:

eth0      Link encap:Ethernet  HWaddr 02:42:ac:14:00:02
          inet addr:172.20.0.2  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20430143 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20966475 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:46532669457 (46.5 GB)  TX bytes:44114090048 (44.1 GB)

Если вы пытаетесь определить, ifconfig eth0было ли все успешно (т.е. в зависимости от разрешений, существует ли интерфейс), то вы можете выполнить одно из следующих действий:

ifconfig eth0
if [ $? -eq 0 ]; then
  echo yay
fi
if ifconfig eth0; then
  echo yay
fi
ifconfig eth0 && echo yay

Скрыть ifconfigвывод можно, добавив > /dev/null:

if ifconfig eth0 > /dev/null; then
  echo yay
fi

Вы спрашивали о печати кода возврата, и это подвох для новичков...

Вы можете просто сделать это:

ifconfig eth0
echo $?

Но после вызова echoкод возврата ( $?) будет echoкодом возврата , а не ifconfig. Чтобы решить эту проблему, просто присвойте его временной переменной:

ifconfig eth0
RET=$?
echo ${RET}
if [ ${RET} -eq 0 ]; then
  echo yay
fi

Примечание: [это встроенная команда, которая может вычислять выражения, квадратные скобки ( [/ ]) на самом деле не являются частью синтаксиса if:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

Если вы действительно пытаетесьполучить IP-адрес интерфейса, то вам, возможно, захочется использовать конвейер, например, один из следующих (существует много способов достичь одного и того же результата):

ifconfig eth0 | grep -Eom1 'inet addr:([0-9]{1,3}\.){3}[0-9]{1,3}' | cut -d: -f2
ifconfig eth0 | sed -re '/inet addr:/!d;s/^[^:]+://;s/ .*$//'

Связанный контент