Se eu fizer algo assim:
IFS=,
x=hello,hi,world
echo $x
Então três argumentos serão extraídos (que são hello
e hi
e world
), e esses três argumentos serão passados para echo
.
Mas quando eu não uso uma variável:
IFS=,
echo hello,hi,world bye
Então a divisão de palavras acontecerá usando o delimitador de espaço e não o delimitador de vírgula e, portanto, os dois argumentos gerados e passados echo
serão hello,hi,world
e bye
.
Existe uma maneira de fazer a divisão de palavras funcionar com um delimitador sem espaço quando não estiver usando uma variável?
Não, a divisão de palavras ocorre apenas após as expansões, não em itens fornecidos diretamente na linha de comando (em shells modernos). O texto em POSIX diz:
(grifo meu)
E Bash :
Não tenho certeza se isso é um grande problema, já que você pode simplesmente substituir as vírgulas por espaços se a string estiver diretamente no script. E se vier de fora, a divisão geralmente acontece naturalmente, em uma substituição de comando ou ao usar
read
, etc.No Bourne shell original, o comportamento era um pouco diferente, @Stéphane Chazelas discutiu isso em uma resposta a outra pergunta um tempo atrás
A primeira divisão da linha de comando é feita em metacaracteres:
Isso é antes de qualquer expansão, antes de qualquer divisão de palavras (depois das expansões).
Isso acontece independentemente do valor do IFS.
Uma vírgula não é um metacaractere, portanto uma linha (inicialmente) não será dividida nela.