Я относительно новичок в написании скриптов на 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/ .*$//'