{ ... ; }
запускает команды в контексте текущей оболочки. $ IFS (или любая другая переменная), измененная внутри фигурных скобок, сохраняет свое значение даже после закрывающей скобки.
Чтобы локализовать изменение переменной, используйте подоболочку (круглые скобки):
(IFS=:; echo "${arr[*]}")
Причина, по которой echo $IFS
не выводит двоеточие, другая. Фактически, после того как $ IFS был установлен в :
, любая переменная, содержащая :
, печатает пусто:
IFS=:
x=:
echo $x # Nothing!
Это потому, что переменная без двойных кавычек подвергается разбиению по словам, в которой для определения разделителя используется $ IFS.
x=a:b:c
echo $x # a:b:c
IFS=:
echo $x # a b c
Во втором случае эхо имеет три параметра. Когда вы echo $IFS
, параметр отсутствует, независимо от текущего значения $ IFS.