Em um script de shell, se eu definir uma variável como FOO=25
, existe uma diferença entre referenciá-la como $FOO$
e ${FOO}$
?
command-line
scripts
Karnivaurus
fonte
fonte
$
no final! Será tratado como caractere normal e não como parte do nome da variável.Respostas:
Na maioria das situações, tanto
$var
e${var}
são os mesmos. (Observe que você não deve usar um$
no final!)Um exemplo em que você precisa de chaves é quando você precisa colocar uma variável em uma sequência contínua.
Exemplo:
será exibido
hello
.fonte
Para responder à sua pergunta principal,
${foo}
é chamado de "expansão de parâmetros" . Para ser mais preciso, o$
próprio inicia a expansão do parâmetro, na{ }
verdade é opcional de acordo com a especificação POSIX , mas pode ser útil para indicar o final do nome da variável:Basicamente,
$foo
e${foo}
são idênticos. Além de casos como o descrito acima ou quando você está manipulando strings , eles são completamente equivalentes.No entanto, você realmente não deve usar nenhum deles. A regra geral é que, com muito poucas exceções, você deve sempre usar
"$foo"
or"${foo}"
e never$foo
or${foo}
. Você deve sempre citar suas variáveis para evitar chamar o operador split + glob (mais sobre isso mais tarde). Você certamente não quer$foo$
. A final$
é irrelevante:Portanto, embora as variáveis não citadas às vezes sejam OK:
Geralmente não são e devem ser realmente evitados:
Observe que os colchetes também não ajudam aqui:
Quando você usa
$foo
ou${foo}
, o shell divide o valor salvo na variável no espaço em branco (isso pode ser alterado definindo aIFS
variável para outra coisa) em uma lista e, em seguida, cada elemento da lista é tratado como um padrão global e expandido para quaisquer arquivos ou diretórios correspondentes. Isso é conhecido como operador split + glob . Para ilustrar, considere um diretório com dois arquivos:Agora, vamos definir uma variável para
foo *
:O que acontece se tentarmos verificar se existe um arquivo com esse nome?
A variável foi dividida em
foo
e*
e, uma vez que*
é um curinga que corresponde a qualquer cadeia, o shell diz que um arquivo chamadofoo *
exxists. No entanto, se citá-lo corretamente, isso não acontece:Esse foi um exemplo trivial para ilustrar o ponto. Imagine se eu tivesse usado em
rm
vez dissoecho
.Então, primeira regra: sempre cite suas variáveis. Você pode usar um
"$foo"
ou outro,"${foo}"
mas citá-lo de qualquer maneira. Para obter mais detalhes sobre o uso de variáveis com segurança, consulte estas postagens:fonte
$ var="foo *"
ser$ foo="foo *"
? Você não usa emvar
lugar algum.