Existe uma maneira de fazer a divisão de palavras funcionar com um delimitador não espacial quando não estiver usando uma variável?

5

Se eu fizer algo assim:

IFS=,
x=hello,hi,world
echo $x

Em seguida, 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 não uso uma variável:

IFS=,
echo hello,hi,world bye

Em seguida, a divisão de palavras ocorrerá usando o delimitador de espaço e não o delimitador de vírgula. Portanto, os dois argumentos gerados e transmitidos para echo serão hello,hi,world e bye .

Existe uma maneira de fazer a divisão de palavras funcionar com um delimitador não espacial quando não estiver usando uma variável?

    
por user267935 30.12.2017 / 11:45

2 respostas

5

Não, a divisão de palavras acontece somente após expansões, não em coisas dadas diretamente na linha de comando (em conchas modernas, isto é). O texto no POSIX diz:

2.6.5 Field Splitting
After parameter expansion (Parameter Expansion), command substitution (Command Substitution), and arithmetic expansion (Arithmetic Expansion), the shell shall scan the results of expansions and substitutions that did not occur in double-quotes for field splitting and multiple fields can result.

(ênfase minha)

E Bash :

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

Não tenho certeza se isso é um grande problema, pois você pode substituir as vírgulas por espaços se a string estiver diretamente no script. E se vier do lado de fora, então a divisão geralmente acontece naturalmente, em uma substituição de comando ou ao usar read , etc.

No shell Bourne original, o comportamento era um pouco diferente, @ Stéphane Chazelas discutimos isso em uma resposta a outra pergunta um tempo atrás

    
por 30.12.2017 / 11:50
0

A primeira divisão da linha de comando é feita em metacaracteres:

metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab newline

Isso é antes de qualquer expansão, antes de qualquer divisão de palavras (após expansões).
Isso acontece independentemente do valor do IFS.

Um coma não é um metacaractere, portanto, uma linha (inicialmente) não será dividida.

    
por 30.12.2017 / 15:17

Tags