Comparação baseada em flag simples no Linux

1

Estou tentando executar um script simples para verificar um sinalizador e verificar condições adicionais. O seguinte sempre ecoa "Executar script ...", independentemente do valor do sinalizador:

FLAG_Control=false
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
    echo "Run script.."
fi

enquanto isso funciona como esperado:

FLAG_Control=false
if [ $FLAG_Control = true ] && [ -d /path/to/dir ];then
    echo "Run script.."
fi

Isso significa que eu tenho que fazer uma comparação explícita? Estou fazendo algo errado no primeiro?

    
por techiebong 26.03.2015 / 16:21

3 respostas

1

Tente com if $FLAG_Control && [ -d /path/to/dir ]; ... . Observe que os colchetes não fazem parte da sintaxe de if ; Nesse caso, você deseja que $FLAG_Control seja interpretado como um comando ( true ou false ), e isso funcionará bem com && e a outra cláusula [ ... ] . (Isso pressupõe que sua variável esteja sempre definida como true ou false .)

O motivo pelo qual seu teste inicial não faz o que você quis dizer pode ser visto na documentação de test (também conhecido como [ ):

-n STRING
       the length of STRING is nonzero

STRING equivalent to -n STRING

Como false não tem nenhum significado especial aqui, ele é visto simplesmente como uma string não vazia, que é interpretada como um valor verdadeiro.

    
por 26.03.2015 / 16:26
0

Eu tenho aprendido scripts bash nos últimos meses. O que aprendi é que não há variáveis booleanas no bash. No entanto, isso não quer dizer que não haja valores booleanos.

Se / então procurar por 1 ou 0. Agora ... aqui está a advertência: 0 é verdadeiro e todo o resto é falso. Por exemplo, quando você verifica se existe diretamente, o resultado volta como 0 não 1.

Se você receber qualquer tipo de código de erro da função que você chama, você pode capturar esse erro.

Então, tente isso:

FLAG_Control=1
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
   echo "Run script.."
fi

Espero que ajude alguns ...

    
por 26.03.2015 / 17:02
-1

A coisa mais próxima de um valor true para um shell de uma variável é um valor set . Existem algumas propriedades de parâmetros nativos que também dependem disso. Por exemplo:

FLAG=
[ -d "${FLAG:+$HOME}" ] || ! echo \
either \$HOME is not a directory or \$FLAG is null or unset

Acima de $FLAG condicionalmente expande para o valor de $HOME apenas se estiver definido e não nulo. Existem várias variações sobre isso, mas a essência geral é que o valor do parâmetro nem sempre é tão importante quanto se o parâmetro tem um valor. Configurar FLAG para qualquer valor acima resultaria em um verdadeiro retorno de test em vez de uma falha.

    
por 26.03.2015 / 18:28

Tags