Obtém um booleano da expressão de teste

1

Eu tenho este código bash:

   local r2g_keep_temp=$(r2g_match_arg "--keep" "${my_args[@]}");
   local r2g_multi_temp=$(r2g_match_arg "--multi" "${my_args[@]}");

   local r2g_multi=[ "$r2g_multi_temp" || "$r2g_keep_temp" ];

Eu só quero que r2g_multi represente um booleano, se $ r2g_multi_temp ou $ r2g_keep_temp estiverem definidos. Como eu posso fazer isso? O acima é sintaticamente inválido.

Por outro lado, isso é sintaticamente válido, mas não tem certeza se está correto:

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");
    
por Alexander Mills 08.05.2018 / 00:59

1 resposta

1

Não há booleanos nos scripts do shell.

A melhor simulação para eles são valores inteiros.
Por exemplo, 0 para true e 1 para false .

[[ -v variable_name ]] retornará 1 se o variable_name não tiver sido definido ou 0 se for .

Portanto, você pode obter o comportamento desejado com isso:

// If one of the variables is defined, return value of this command is 0.
[[ -v r2g_keep_temp ]] || [[ -v r2g_multi_temp ]]

// Save the return value of the last command (0 or 1).
local r2g_multi="$?"

De courese, você pode interpretar os números como quiser, eu só queria demonstrar um exemplo.

A propósito,

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");

não é o que você deseja.

  1. Primeiro, as variáveis r2g_multi_temp e r2g_keep_temp serão substituídas por seus valores.
  2. Agora, o subshell tentará executar o valor de r2g_multi_temp .
  3. Se por algum milagre esse valor for um comando bash válido, haverá 2 casos:
    • Esse comando é executado com sucesso e seu stdout é salvo no r2g_multi .
    • Esse comando falhou e o subshell chamou o valor do r2g_multi_temp .
      História semelhante novamente, se for um comando válido, ele será executado e seu stdout será anexado ao possível stdout do comando executado a partir do valor de r2g_keep_temp e tudo será armazenado em r2g_multi .

Ao todo, fuja disso: D

    
por 08.05.2018 / 01:22