Eu estive observando alguns scripts que outras pessoas escreveram (especificamente Red Hat), e muitas de suas variáveis são atribuídas usando a seguinte notação
VARIABLE1="${VARIABLE1:-some_val}"
ou algumas outras variáveis de expansão
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Qual é o ponto de usar esta notação em vez de apenas declarar os valores diretamente (por exemplo, VARIABLE1=some_val
)?
Existem benefícios para esta notação ou possíveis erros que seriam evitados?
Isso :-
tem significado específico nesse contexto?
bash
shell-script
scripting
variable
Rothgar
fonte
fonte
man bash
; procure o bloco "Expansão de parâmetros" (em cerca de 28%). Essas atribuições são, por exemplo, funções padrão: "Use o valor padrão apenas se ainda não houver nenhum valor definido".Respostas:
Essa técnica permite que uma variável receba um valor se outra variável estiver vazia ou indefinida. NOTA: Essa "outra variável" pode ser a mesma ou outra variável.
excerto
NOTA: Este formulário também funciona
${parameter-word}
,. Se você quiser ver uma lista completa de todas as formas de expansão de parâmetros disponíveis no Bash, sugiro que você dê uma olhada neste tópico no wiki do Bash Hacker intitulado: " Expansão de parâmetros ".Exemplos
variável não existe variável existeO mesmo pode ser feito avaliando outras variáveis ou executando comandos na parte do valor padrão da notação.
Mais exemplos
Você também pode usar uma notação ligeiramente diferente, onde é justa
VARX=${VARX-<def. value>}
.No exemplo acima
$VAR1
e$VAR2
já foram definidas com a string "tem outro valor", mas$VAR3
era indefinido, de modo que o valor padrão foi usado em vez,0
.Outro exemplo
Verificando e atribuindo usando
:=
notaçãoPor fim, mencionarei o operador prático
:=
,. Isso fará uma verificação e atribuirá um valor se a variável em teste estiver vazia ou indefinida.Exemplo
Observe que
$VAR1
agora está definido. O operador:=
fez o teste e a atribuição em uma única operação.No entanto, se o valor for definido anteriormente, será deixado sozinho.
Tabela de referência do Handy Dandy
Referências
fonte
bash
. O${var:-word}
do Q é, mas não o${var-word}
acima. A documentação POSIX tem uma bela mesa, porém, pode valer a pena copiá-lo para esta resposta - pubs.opengroup.org/onlinepubs/9699919799/utilities/...echo "${FOO:=default}"
é ótimo se você realmente deseja oecho
. Mas se não, tente o:
built-in ...: ${FOO:=default}
Seu$FOO
está definidodefault
como acima (ou seja, se ainda não estiver definido). Mas não há eco$FOO
no processo.${4:-$VAR}
irá funcionar.O @slm já incluiu os documentos POSIX - que são muito úteis -, mas eles não expandem realmente como esses parâmetros podem ser combinados para afetar um ao outro. Ainda não há menção aqui deste formulário:
Este é um trecho de outra resposta minha, e acho que demonstra muito bem como isso funciona:
Outro exemplo do mesmo :
O exemplo acima aproveita todas as quatro formas de substituição de parâmetro POSIX e seus vários
:colon null
ounot null
testes. Há mais informações no link acima e aqui está novamente .Outra coisa que as pessoas geralmente não consideram
${parameter:+expansion}
é o quão útil pode ser em um documento aqui. Aqui está outro trecho de uma resposta diferente :TOPO
Aqui você definirá alguns padrões e se preparará para imprimi-los quando chamados ...
MEIO
É aqui que você define outras funções para chamar sua função de impressão com base em seus resultados ...
INFERIOR
Agora você tem tudo configurado, então aqui é onde você executa e obtém seus resultados.
RESULTADOS
Vou explicar o porquê daqui a pouco, mas a execução do procedimento acima produz os seguintes resultados:
COMO FUNCIONA:
O principal recurso aqui é o conceito de
conditional ${parameter} expansion.
Você pode definir uma variável para um valor somente se estiver desconfigurada ou nula usando o formulário:Se, em vez disso, você desejar definir apenas uma variável não configurada, você omitirá os
:colon
valores nulos e permanecerá como está.NO ÂMBITO DE APLICAÇÃO:
Você pode perceber isso no exemplo acima
$PLACE
e$RESULT
ser alterado quando definido viaparameter expansion
mesmo que_top_of_script_pr()
já tenha sido chamado, presumivelmente configurando-os quando é executado. A razão pela qual isso funciona é que_top_of_script_pr()
é uma( subshelled )
função - eu a incluí emparens
vez da{ curly braces }
usada para as outras. Como é chamado em um subshell, todas as variáveis que ele define sãolocally scoped
e, quando retornam ao shell pai, esses valores desaparecem.Mas quando
_more_important_function()
conjuntos$ACTION
,globally scoped
isso afeta a_less_important_function()'s
segunda avaliação,$ACTION
porque_less_important_function()
conjuntos$ACTION
somente via${parameter:=expansion}.
fonte
Experiência pessoal.
Às vezes, uso esse formato nos meus scripts para fazer uma substituição ad-hoc de valores, por exemplo, se eu tiver:
Eu posso correr:
sem precisar alterar o valor padrão original de
SOMETHING
.fonte