Se condição para testar se um comando fornece saída nula ou não

0

Estou executando uma coleta de endereços IP do HMC no AIX para cada LPAR

$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123
ABCD123:Not Activated::Unknown
$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD456
ABCD456:Running:10.8.34.21:VIOS 2.2.5.20

Estou usando o comando cut com o delimitador para obter os detalhes do IP. Os valores não IP não são dados de saída.

$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123 | cut -d : -f3
10.8.34.21
$ lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD456 | cut -d : -f3

Existem alguns servidores com o endereço IP não disponível. Como eu poderia dizer ao comando if para ignorar aquele com nulo ou sem saída para atribuir um valor desconhecido

Você poderia, por favor, me dizer como usar o teste dessa condição para os dados sem valor? Eu posso atribuir uma variável como ipaddr=unknown

    
por satsensort 24.04.2018 / 17:30

3 respostas

1

Use a expansão do parâmetro padrão interno de bash :

ipaddr="$(lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names=ABCD123 | cut -d : -f3)"
echo "${ipaddr:-unknown}"

Primeiro, usamos uma construção de subshell $( command ) para capturar a saída de command e atribuí-la a uma variável. Como o comando em questão está incluindo seu cut , ele será corretamente nulo como esperado no caso de seu comando não retornar um endereço IP.

Em seguida, usamos a construção ${var:-default} , que será expandida para o valor padrão fornecido se var não estiver definido ou vazio.

Você também pode, se estiver se referindo a essa variável mais de uma vez, usar uma atribuição padrão que também definirá o valor dessa variável para o padrão, se não for definida como vazio:

$ echo "$foo"

$ echo "${foo:=bar}"
bar
$ echo "$foo"
bar

Ou interrompa seu script e envie um erro se não estiver definido ou vazio:

$ echo "${bar:?bar is unset or empty}"
-bash: bar: bar is unset
$ echo $?
1
    
por 24.04.2018 / 17:44
2
for name in ABCD123 ABCD456; do
    ip_addr=$( lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version --filter lpar_names="$name" | cut -d : -f 3 )

    printf 'Got IP address "%s" for lpar name "%s"\n' "${ip_addr:-unknown}" "$name"
done

A expansão do parâmetro ${ip_addr:-unknown} expandirá para a string unknown se $ip_addr estiver vazia ou se a variável não estiver definida (é sempre definida como algo aqui, mas pode estar vazia), caso contrário ela se expande para o valor de a variável ip_addr .

    
por 24.04.2018 / 17:43
0

Existem várias maneiras de fazer isso. Uma técnica é:

ipaddr=$( lssyscfg -m 780 -r lpar -F name:state:rmc_ipaddr:os_version \
    --filter lpar_names=ABCD123 | cut -d : -f3 | grep . || echo unknown )
    
por 24.04.2018 / 18:16