Como usar o valor de retorno de um comando Bash como “ifconfig” para ser usado como um argumento para uma declaração if no script Bash

1

Sou relativamente novo no Bash, mas estou muito familiarizado com o Python e com muitos comandos Bash. Eu queria saber se é possível usar um comando como ifconfig eno1 e usar a saída como uma condição a ser usada em uma instrução if . 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, a ser usado no exemplo de instrução if a seguir (assumindo que ifoutput é o nome da variável):

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

 then 
         echo connection is active! 
 fi

Eu pensei em possivelmente chamar um script Python que faz essencialmente a mesma coisa, no entanto, eu estava pensando que iria me deparar com o mesmo problema; não sendo possível obter um valor de retorno individual do script Python a ser usado na instrução if . Por favor, informe e por favor, vá fácil comigo - como eu disse, eu sou relativamente novo no Bash! Eu já tenho métodos de fazer isso estritamente usando Python, no entanto, estou tentando aprender mais sobre scripts Bash. Obrigado antecipadamente!

    
por RickwhoPrograms 06.08.2018 / 17:16

1 resposta

4

ifconfig retornará um valor numérico de 8 bits quando for concluído (como qualquer processo * nix que saia limpo).

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 será enviado 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ê estiver tentando determinar se ifconfig eth0 foi bem-sucedido (ou seja, dependendo das permissões, a interface existe), 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

Ocultar a saída de ifconfig pode ser obtida anexando > /dev/null :

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

Você perguntou sobre a impressão do código de retorno, e isso é uma pegadinha para iniciantes ...

Você pode simplesmente fazer isso:

ifconfig eth0
echo $?

Mas depois de chamar echo , o código de retorno ( $? ) será o código de retorno de echo , não ifconfig 's ... 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

Observação: [ é um comando interno que pode avaliar expressões, as chaves quadradas ( [ / ] ) não fazem parte da sintaxe 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 '['.

Se você está realmente tentando obter o endereço IP de uma interface , talvez queira usar um pipeline, como um dos seguintes (há várias 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/ .*$//'
    
por 06.08.2018 / 17:32