“echo $ IFS” não retorna o valor de IFS

5

Eu configurei o IFS para x , ou seja, IFS=x . Agora, se eu verificar o valor de IFS , ele parecerá estar vazio se eu não usar aspas duplas:

~ $ echo $IFS | cat -e
$
~ $ echo "$IFS" | cat -e
x$
~ $ echo $HOME   
/home/mar
~ $ echo "$HOME"
/home/mar
~ $ 

Como visto acima, $HOME não se comporta assim. Qual é a razão para tal comportamento?

    
por Martin 15.06.2015 / 14:23

3 respostas

6

Depois que a variável é expandida, a divisão de palavras ocorre e ela é dividida em palavra (s) vazia (s). A divisão é feita usando cada caractere da variável IFS como delimitador e, como $IFS se expande apenas para caracteres no IFS , ela é dividida em palavra (s) vazia (s).

Então, por exemplo:

IFS=xxx;
printf %q $IFS
''''''[root@localhost ~]#

E se você aspas duplas, você está dizendo bash para tratar tudo dentro das citações como uma palavra:

printf %q "$IFS"
xxx[root@localhost ~]#
    
por 15.06.2015 / 15:13
4

Acho que está relacionado ao que está descrito no Guia avançado de script de script

Use double quotes to prevent word splitting. [2] An argument enclosed in double quotes presents itself as a single word, even if it contains whitespace separators.

Com os exemplos (5.1):

var="'(]\{}\$\""
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     Doesn't make a difference.

IFS='\'
echo $var        # '(] {}$"     \ converted to space. Why?
echo "$var"      # '(]\{}$"
    
por 15.06.2015 / 14:40
0

Outra maneira de contornar a questão da divisão de palavras aqui é:

set | grep -w IFS=

que gera o IFS padrão como

IFS=$' \t\n'

Veja esta postagem relacionada no estouro de pilha:

por 07.06.2018 / 19:37

Tags