Выход
echo $var
сильно зависит от значения переменной IFS
. По умолчанию он содержит символы пробела, табуляции и новой строки:
[ks@localhost ~]$ echo -n "$IFS" | cat -vte
^I$
Это означает, что когда оболочка выполняет разделение поля (или разбиение слов), он использует все эти символы в качестве разделителей слов. Это то, что происходит при ссылке на переменную без двойных кавычек, чтобы ее эхо ($var
), и поэтому ожидаемый результат изменяется.
. Один из способов предотвратить разделение слов (помимо использования двойных кавычек) - установить IFS
к null. См. http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_05 :
Если значение IFS равно null, ни одно поле
Установка в значение null означает установку пустого значения:
IFS=
Тест:
[ks@localhost ~]$ echo -n "$IFS" | cat -vte ^I$ [ks@localhost ~]$ var=$'key\nvalue' [ks@localhost ~]$ echo $var key value [ks@localhost ~]$ IFS= [ks@localhost ~]$ echo $var key value [ks@localhost ~]$