Teste se $ 1 ou $ 2 são nulos com “-z” - BASH

1

Estou fazendo vários monitores de raids no mesmo script e quero que o script envie alerta / go vermelho se qualquer variável retornar null.

Eu tentei ler e pensei que tinha, mas o que eu tentei acabou, nunca falhando.

Para o teste, eu tenho grep falhar e isso deve fazer com que ele falhe, mas até agora, eu não posso fazê-lo falhar, na verdade apenas sempre passa.

O ambiente de teste é assim:

var="$(sudo /usr/StorMan/arcconf GETCONFIG 1 LD 0 | grep Optimal)"
var1="$(sudo /usr/StorMan/arcconf GETCONFIG 1 LD 1 | grep fail)"

Isso funciona para 1 variável

if [ -z "$var" ]

Eu tentei

if [ -z "$var" ] && [ -z "$var1" ]
if [ -z "$var" && -z "$var1" ]
if [[ -z "$var" && -z "$var1" ]]

Mas em vão, tenho certeza que alguém saberia o que estou fazendo de errado em um piscar de olhos, eu aprecio o tempo gasto para ler isso!

    
por FreeSoftwareServers 06.08.2016 / 02:56

4 respostas

5

Use || em vez de && , por exemplo,

if [ -z "$var" ] || [ -z "$var1" ]

O manual do bash explica:

AND and OR lists are sequences of one or more pipelines separated by the control operators && and ||, respectively. AND and OR lists are executed with left associativity.

    
por 06.08.2016 / 03:02
2

O que você está pedindo já foi mencionado:

if [ -z "$var" ] || [ -z "$var1" ]; then
  echo "one or both are empty."
fi

No entanto, vale a pena mencionar que, se esse é o único uso que você está fazendo dessas variáveis, não é necessário defini-las como variáveis.

Você pode verificar o status de saída de um comando diretamente em if constructs - e, de fato, [ é um comando, não um token especial do shell. (É exatamente equivalente ao comando test ; veja man [ )

Pelo que entendi, a saída do seu primeiro comando sudo DEVE conter "Ótimo" e a saída do segundo DEVE conter "falhar", caso contrário você deseja acionar um alerta.

Você poderia fazer isso com muito mais clareza na minha opinião assim:

if sudo /usr/StorMan/arcconf GETCONFIG 1 LD 0 | grep -q Optimal &&
   sudo /usr/StorMan/arcconf GETCONFIG 1 LD 1 | grep -q fail
then
  echo "All is well."
else
  echo "Error condition!"
fi
    
por 06.08.2016 / 03:17
1

Se você quiser que "ou" fique vazio, tente OU || ?

if [ -z "$var" ] || [ -z "$var1" ]

... Pode ser assim tão fácil?

    
por 06.08.2016 / 03:02
1

Duas soluções são:

if [[ -z $a || -z $b ]];      ### (not A) OR (not B)
if ! [[ $a && $b ]];          ### not (A and B)

mais portátil:

if [ -z "$a" ] || [ -z "$b" ];
if ! ( [ "$a" ] && [ "$b" ] );

Essas opções podem funcionar, mas são rejeitadas pelo POSIX (argumentos do > 4: os resultados não são especificados.):

if [ -z "$a" -o -z "$b" ];
if [ ! \( "$a" -a "$b" \) ];
    
por 06.08.2016 / 07:29