1. Variáveis e Strings

Vamos ver alguns exemplos práticos com explicações conceituais sobre esse assunto.

Criar uma variável chamada str e assinar o valor “hello”:

str=hello
str='hello'
str="hello"

As três versões funcionam igualmente bem nesse caso. Para o shell, um sequência de caracteres sem espaços (e sem outros caracteres especiais) é considerado “texto”, mais ou menos como strings entre aspas simples e duplas em algumas outras linguagens. Porém, vamos ao próximo exemplo que ilustra outra situação.

Criar uma variável chamada str que contém a string “hello world”:

str=hello\ world
str=hello' 'world
str=hello" "world
str='hello world'
str="hello world"

Aqui entra uma característica importante sobre o shell: por padrão, argumentos são separados por espaços.

Para o shell, espaço é sintaxe, ou seja, tem significado especial.

Precisamos fazer o shell interpretar o espaço como um caractere literal, e não como um caracteres especial que separa “words” (como é dito em inglês).

Uma maneira de tornar o espaço literal e escapar com um backslash. Outra é colocando aspas (simples ou duplas) ao redor do espaço apenas. Outra forma ainda é colocar todos os caracteres entre aspas.

2. Perigos do Uso Incorreto de Espaços

Vejamos este caso: você tem dois arquivos no diretório atual, “invalid formula.txt” e “formula.txt” e quer remover o primeiro (“invalid formula.txt”). Então você executa o seguinte comando:

#
# WRONG, DANGER, WARNING, PAIN, SUFFERING
#
rm invalid formula.txt
The shadows of the dark side have fallen uppon us.
— quote
Master Yoda

O que vai acontecer dá até medo de falar. O shell vai usar (por padrão) o espaço para separar os parâmetros da linha de comando, o que fará o rm receber dois argumentos: invalid e formula.txt. Não temos nenhum arquivo chamado invalid no diretório atual, então o rm mostra um erro para a tentativa de remover esse arquivo (inexistente) e passa para o próximo argumento, que é formula.txt. Como esse arquivo existe, ele é removido. O arquivo invalid formula.txt continua intacto e o arquivo que deveria ter permanecido no disco foi acidentalmente removido. Veja algumas maneiras de remover o arquivo de maneira correta:

#
# CORRECT, SAFE
#
rm invalid\ formula.txt
rm invalid' 'formula.txt
rm invalid" "formula.txt
rm 'invalid formula.txt'
rm "invalid formula.txt"