Redefina a variável se a nova definição não estiver vazia

0

Eu tenho isso:

master="master";
integration="integration";

if [ -f '.vcs.json' ]; then
    master='read_json -f .vcs.json -k git.master'
    integration='read_json -f .vcs.json -k git.integration'
fi

no entanto, só quero redefinir as variáveis mestre / integração se os resultados de read_json não estiverem vazios.

Estou pensando em algo assim:

master="master";
integration="integration";

if [ -f '.vcs.json' ]; then
    master="${'read_json -f .vcs.json -k git.master':-master}"
    integration="${'read_json -f .vcs.json -k git.integration':-integration}"
fi

mas não tenho certeza se essa sintaxe está correta.

    
por Alexander Mills 12.09.2018 / 00:12

2 respostas

2

Se você quiser apenas agir se uma string não estiver vazia, use um parâmetro padrão ao fazer referência à variável:

master="$(read_json -f .vcs.json -k git.master)"

Se os comandos subshell não retornarem nenhuma saída, as variáveis serão nulas. Você pode aproveitar isso com a substituição padrão:

do-a-thing "${master-master}" # if 'master' is null, use the default value 'master'
                              # otherwise, use the contents of the variable
    
por 12.09.2018 / 00:22
0

Eu colocaria a lógica de cabeça para baixo:

# Note that the variables 'master' and 'integration' are NOT defined yet
if [ -f '.vcs.json' ]; then
  master="${'read_json -f .vcs.json -k git.master':-master}"
  integration="${'read_json -f .vcs.json -k git.integration':-integration}"
fi
# Set default values if empty or missing
: ${master:=master} ${integration:=integration}
# They are now guaranteed to be non-empty
echo $master $integration
    
por 12.09.2018 / 09:42