Em scripts de shell, quando usamos {}
ao expandir variáveis?
Por exemplo, eu vi o seguinte:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
Existe uma diferença significativa ou é apenas estilo? Um prefere o outro?
bash
shell
syntax
curly-braces
Novo usuário
fonte
fonte
{}
é conhecido como expansão de chaves .${}
é conhecido como expansão variável. Eles fazem coisas diferentes. Eu o votaria com exceção do bit sem expansão.$()
é usado para executar um comando, quemd5sum=$(md5sum foo.bin)
armazena a saída demd5sum foo.bin
na variávelmd5sum
, agora acessível usando${md5sum}
. Além disso, +1 e muito mais em espírito de OP por mencionar que é uma boa prática ser explícito!$()
executa seu comando a partir de um subshell .${1:-20}
é uma forma de expansão de parâmetros. Aqui não é óbvio, porque utiliza principalmente dígitos e operadores aritméticos, o que nos engana ao pensar que há aritmética envolvida, mas na verdade se refere ao parâmetro posicional$1
, que, se não definido, será substituído por um valor padrão20
(a sintaxe é${variable:-default_value}
).Variáveis são declaradas e atribuídas sem
$
e sem{}
. Você tem que usaratribuir. Para ler a variável (em outras palavras, 'expanda' a variável), você deve usar
$
.Isso me confundiu algumas vezes - em outros idiomas, nos referimos à variável da mesma maneira, independentemente de ela estar à esquerda ou à direita de uma tarefa. Mas o script de shell é diferente,
$var=10
não faz o que você pensa que faz!fonte
Você usa
{}
para agrupar. As chaves são necessárias para remover a referência dos elementos da matriz. Exemplo:fonte
dir=(*)
. Tanto quanto eu sei,dir
é um comando embutido para listar o conteúdo do diretório (equivalente als -C -b
). Você poderia explicar?dir
é o nome da variável e os parênteses são usados para coletar a expansão do nome do arquivo*
em uma matriz.Você também pode fazer alguma manipulação de texto dentro do aparelho:
Resultado:
ou
Resultado:
Você está certo em "variáveis regulares" não são necessárias ... Mas é mais útil para a depuração e a leitura de um script.
fonte
O final do nome da variável geralmente é representado por um espaço ou nova linha. Mas e se não quisermos um espaço ou uma nova linha depois de imprimir o valor da variável? Os colchetes indicam ao interpretador de shell onde está o final do nome da variável.
Exemplo clássico 1) - variável de shell sem espaço em branco à direita
Exemplo 2) Caminho de classe Java com jars com versão
(A resposta de Fred já afirma isso, mas o exemplo dele é um pouco abstrato demais)
fonte
Chaves sempre são necessárias para acessar os elementos da matriz e realizar a expansão da chave.
É bom não ter muito cuidado e usá-lo
{}
na expansão de variáveis de shell, mesmo quando não há margem para ambiguidade.Por exemplo:
Portanto, é melhor escrever as três linhas como:
o que é definitivamente mais legível.
Uma vez que um nome de variável não pode começar com um dígito, shell não precisa de
{}
variáveis em torno numeradas (como$1
,$2
etc.), a menos que tal expansão é seguido por um dígito. Isso é muito sutil e faz uso explícito{}
em tais contextos:Vejo:
fonte
It's good to be not over-cautious
: Gostaria de saber o que a maioria das pessoas pensa. Use chaves o tempo todo, para não esquecê-las quando forem necessárias, ou usá-las somente quando necessário, para melhorar a legibilidade.Seguindo a sugestão de SierraX e Peter sobre manipulação de texto, colchetes
{}
são usados para passar uma variável para um comando, por exemplo:Digamos que você tenha um arquivo sposi.txt que contenha a primeira linha de um conhecido romance italiano:
Ouput:
quel ramo del lago di como che volge a mezzogiorno
Agora crie duas variáveis:
Agora substitua a variável word content por new_word , dentro do arquivo sposi.txt
Ouput:
quel filone del lago di como che volge a mezzogiorno
A palavra "ramo" foi substituída.
fonte
weel-known novel
bit. Votado no entanto.