1

Я относительно новичок в написании сценариев 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 ответ1

4

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/ .*$//'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .