Você sempre precisa de aspas em torno de variáveis em todos os contextos de lista , ou seja, em todos os lugares a variável pode ser expandida para vários valores, a menos que você queira os três efeitos colaterais de deixar uma variável sem aspas.
Os contextos de lista incluem argumentos para comandos simples como [
ou echo
, as for i in <here>
atribuições a matrizes ... Existem outros contextos em que as variáveis também precisam ser citadas. O melhor é sempre citar variáveis, a menos que você tenha uma boa razão para não fazê-lo.
Pense na ausência de aspas (em contextos de lista) como o operador split + glob .
Como se echo $test
fosse echo glob(split("$test"))
.
O comportamento do shell é confuso para a maioria das pessoas, porque na maioria das outras linguagens, você coloca aspas em torno de cadeias fixas, como puts("foo")
, e não em torno de variáveis (como puts(var)
), enquanto no shell é o contrário: tudo é string em shell, colocando aspas em tudo seria complicado, você echo test
, você não precisa "echo" "test"
. No shell, as aspas são usadas para outra coisa: impedir algum significado especial de alguns caracteres e / ou afetar o comportamento de algumas expansões.
Em [ -n $test ]
ou echo $test
, o shell é dividido $test
(em branco por padrão) e, em seguida, executa a geração do nome do arquivo (expanda todos os *
padrões '?' ... para a lista de arquivos correspondentes) e passa essa lista de argumentos para os comandos [
ou echo
.
Mais uma vez, pense nisso como "[" "-n" glob(split("$test")) "]"
. Se $test
estiver vazio ou contiver apenas espaços em branco (spc, tab, nl), o operador split + glob retornará uma lista vazia, então [ -n $test ]
será "[" "-n" "]"
, que é um teste para verificar se "-n" é a sequência vazia ou não. Mas imagine o que teria acontecido se $test
fosse "*" ou "= foo" ...
Em [ -n "$test" ]
, [
é passado os quatro argumentos "["
, "-n"
, ""
e "]"
(sem as aspas), que é o que queremos.
Se é echo
ou [
não faz diferença, é exatamente isso que echo
produz a mesma coisa, seja passado um argumento vazio ou nenhum argumento.
Consulte também esta resposta a uma pergunta semelhante para obter mais detalhes sobre o [
comando e a [[...]]
construção.
echo
, espaços extras e novas linhas serão removidos.