Os shells iniciais tinham apenas um único tipo de dados: strings. Mas é comum manipular listas de strings, geralmente ao passar vários nomes de arquivos como argumentos para um programa. Outro caso de uso comum para divisão é quando um comando gera uma lista de resultados: a saída do comando é uma cadeia, mas os dados desejados são uma lista de cadeias de caracteres. Para armazenar uma lista de nomes de arquivos em uma variável, você colocaria espaços entre eles. Então um script de shell como este
files="foo bar qux"
myprogram $files
chamado myprogram
com três argumentos, pois o shell divide a string $files
em palavras. Na época, os espaços nos nomes de arquivos eram proibidos ou amplamente considerados como Não Concluídos.
O shell Korn introduziu matrizes: você pode armazenar uma lista de strings em uma variável. O shell Korn permaneceu compatível com o shell Bourne então estabelecido, portanto expansões de variáveis nuas continuavam passando pela divisão de palavras e o uso de matrizes exigia alguma sobrecarga sintática. Você escreveria o trecho acima
files=(foo bar qux)
myprogram "${files[@]}"
O Zsh tinha matrizes desde o início e seu autor optou por um design de linguagem mais saudável em detrimento da compatibilidade com versões anteriores. Em zsh (sob as regras de expansão padrão) $var
não executa a divisão de palavras; Se você quiser armazenar uma lista de palavras em uma variável, você deve usar uma matriz; e se você realmente quiser dividir palavras, pode escrever $=var
.
files=(foo bar qux)
myprogram $files
Hoje em dia, espaços em nomes de arquivos são algo que você precisa lidar, porque muitos usuários esperam que eles funcionem e porque muitos scripts são executados em contextos sensíveis à segurança, onde um invasor pode estar no controle de nomes de arquivos. Portanto, a divisão automática de palavras geralmente é um incômodo; Portanto, meu conselho geral é sempre usar aspas duplas, por exemplo, escreva "$foo"
, a menos que você entenda por que precisa da divisão de palavras em um caso de uso específico. (Observe que expansões de variáveis nuas sofrem também globbing).