Sou relativamente novo em scripts Bash, mas estou muito familiarizado com Python e muitos comandos Bash. Fiquei me perguntando se é possível usar um comando como ifconfig eno1
e usar a saída como uma condição a ser usada em uma if
instrução. Basicamente, se você emitir:
ifconfig eno1
e você obtém um IP ativo, existe alguma maneira de salvar a saída disso em uma variável como 1/0 ou verdadeiro/falso, para ser usado no if
exemplo de instrução a seguir (assumindo ifoutput
que seja o nome da variável):
if [ "$ifoutput" == "$True"]
then
echo connection is active!
fi
Pensei em possivelmente chamar um script Python que fizesse essencialmente a mesma coisa, mas estava pensando que encontraria o mesmo problema; não sendo possível obter um valor de retorno individual do script Python para ser usado na if
instrução. Por favor, informe e vá com calma comigo - como eu disse, sou relativamente novo em scripts Bash! Já tenho métodos para fazer isso estritamente usando Python, mas estou tentando aprender mais sobre scripts Bash. Desde já, obrigado!
Responder1
ifconfig
retornará um valor numérico de 8 bits quando for concluído (como qualquer processo *nix que saia corretamente).
Normalmente, zero ( 0
) é usado para indicar sucesso e outro valor é usado para indicar falha. Este código de retorno está disponível como $?
.
ifconfig
também produzirá para stdout
, por exemplo:
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)
Se você está tentando determinar se ifconfig eth0
foi bem-sucedido (ou seja: as permissões dependem da existência da interface), você pode fazer o seguinte:
ifconfig eth0
if [ $? -eq 0 ]; then
echo yay
fi
if ifconfig eth0; then
echo yay
fi
ifconfig eth0 && echo yay
A saída de Hiding ifconfig
pode ser obtida anexando um > /dev/null
:
if ifconfig eth0 > /dev/null; then
echo yay
fi
Você perguntou sobre como imprimir o código de retorno, e isso é uma pegadinha para iniciantes...
Você pode simplesmente fazer isso:
ifconfig eth0
echo $?
Mas depois de chamar on echo
, o código de retorno ( $?
) será echo
o código de retorno de ', não ifconfig
de '... Para lidar com isso, basta atribuí-lo a uma variável temporária:
ifconfig eth0
RET=$?
echo ${RET}
if [ ${RET} -eq 0 ]; then
echo yay
fi
Nota: [
é um comando integrado que pode avaliar expressões, os colchetes ( [
/ ]
) não fazem parte da if
sintaxe:
$ 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 `['.
Se você está realmente tentandoobter o endereço IP de uma interface, convém usar um pipeline, como um dos seguintes (há muitas maneiras de obter o mesmo resultado):
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/ .*$//'