Apenas se o mundo contiver substituições.
Então
x=$FRED
é diferente de:
x='$FRED'
Quando faço algo assim:
x="hi echo hello"
ou
x='hi echo hello'
Em seguida, x
conterá a string hi echo hello
.
Mas quando não uso aspas:
x=hi echo hello
Em seguida, x
conterá a string hi
e o comando echo hello
será executado.
Mas e quando o valor de uma variável consiste apenas em uma única palavra, existe uma diferença entre o seguinte:
x="hi"
x='hi'
x=hi
Apenas se o mundo contiver substituições.
Então
x=$FRED
é diferente de:
x='$FRED'
Não, letras e números simples não mudam de significado se forem citados ou não.
Além disso, como mencionado em esta resposta , nenhuma palavra dividida após uma expansão ou globalização de nomes de arquivo acontecem ao fazer uma atribuição, portanto, os caracteres glob não são especiais nesse contexto e, diferentemente da maioria dos outros locais, é possível usar variáveis sem aspas sem chamar divisão.
var1=*
atribui o asterisco literal e var2=$var1
atribui o valor de var1
, independentemente de quaisquer caracteres IFS.
Outros caracteres especiais ainda são especiais:
$
e backticks '
usado para expansões (como @Julian anotou) !
para expansão do histórico, <>|
para redirecionamentos, ;
e &
que finalizam os pipelines e barras invertidas \
que escapam de outros caracteres. Todos esses precisam ser citados ou evitados para evitar seu significado especial.
A primeira coisa que o shell faz é dividir a linha em espaços sem aspas (metacaracteres) em tokens. Isso é diferente da divisão de palavras feita após as expansões em que o valor do IFS é não usado. Os caracteres usados para a divisão inicial do token são fixados como metacaracteres. Tudo isso fará com que var
contenha Hello
(às vezes por um breve momento):
var=Hello echo World # Space
var=Hello;echo World # Semicolon
var=Hello echo World # Tab
var=Hello&echo World # Ampersand
Além disso, para essa divisão inicial de token, o lado direito de uma atribuição é considerado citado.
Tudo isso é equivalente:
var="Hello World"
var='Hello World'
var=Hello\ World
Observe que o único caractere que deve ser citado é o espaço em branco. Mesmo se o IFS for modificado.
Claro, dentro de aspas duplas, várias expansões são permitidas:
var=~"/" ; var=~/ tilde expansion (outside quotes)
var="$PWD" ; var=$PWD parameter and variable expansion
var="$(pwd)" ; var=$(pwd) command substitution
var="$((2+3))" ; var=$((2+3)) arithmetic expansion
var="!$" ; var=!$ history substitution
Todos os pares acima são equivalentes (o mesmo).
Nenhum dos pares funcionará com as mesmas aspas simples internas (ou com algumas aspas de retorno), exemplo:
var='$PWD' ; var=\$PWD
Além disso, isso é não equivalente:
var="( Hello World )" ; var=( Hello World )
Os parênteses acionam uma atribuição de matriz
Então, tudo isso é equivalente:
var=hi
var="hi"
var='hi'
var=\hi
var=h\i
var=\h\i
tendo em conta as condições especiais dadas anteriormente.