Uma variável sem nome ou substituição de comando não é interpretada como uma cadeia, mas como uma lista de padrões de caracteres curinga de nome de arquivo. Ou seja, o valor da variável ou a saída do comando é dividido em partes separadas, separadas por caracteres em IFS (essa etapa é chamada de divisão de campo); cada parte é interpretada como um padrão curinga e, se o padrão corresponder a alguns arquivos, ele será substituído pela lista de nomes de arquivos correspondentes, caso contrário, o padrão será deixado intacto (essa etapa é chamada de geração de nome de arquivo).
Por exemplo, status_arr=( $(git status --porcelain -b) ) define status_arr para a matriz de um elemento que contém a string de 5 caracteres ?? ab' porque IFS contém apenas uma nova linha e não há arquivo correspondente ao padrão ?? ab . Se IFS tivesse seu valor padrão contendo um espaço, então status_arr seria definido como a matriz de dois elementos contendo duas ocorrências da string de 2 caracteres ab .
Se a variável ou substituição de comando estiver entre aspas duplas, a sequência resultante será usada como está: a divisão de campo e a geração de nome de arquivo serão aplicadas apenas às substituições sem aspas.
Você pode desativar completamente a geração de nome de arquivo executando set -f . Isso é útil se você quiser aproveitar a divisão IFS . Observe que set -f desativa completamente a geração de nome de arquivo, não apenas na saída de substituições: set -f; echo * sempre imprime * .
#!/bin/bash
IFS=$'\n'
set -f
touch ab
status_arr=( $(git status --porcelain -b) )
for (( i=0; i<${#status_arr[@]}; i++ )); do
echo "${status_arr[$i]}"
echo "${status_arr[$i]:0:2}"
done
(Aqui, com a geração de nome de arquivo ainda desabilitada, e dado que os elementos de status_arr não podem conter caracteres de IFS por construção, é seguro deixar as aspas duplas nas instruções echo . muito frágil - depende muito da maneira como o array foi construído e do fato de que o status de set -f e o valor de IFS não mudaram desde então. Sempre use aspas duplas em torno de substituições de variáveis e comandos a menos que você tenha um bom motivo para deixá-los de fora e você sabe que não há problema em fazê-lo.)