在组命令中更改$ IFS是永久的

Maz*_*zze 1 bash

这是使用bash 4.3.48。

$ ARR=(entry1 entry2 entry3)
$ echo "${ARR[*]}"
entry1 entry2 entry3
Run Code Online (Sandbox Code Playgroud)

一切按预期进行,直到这里,但之后

$ { IFS=: ; echo "${ARR[*]}" ;}
entry1:entry2:entry3
Run Code Online (Sandbox Code Playgroud)

更改后,IFS被奇怪地永久性地更改了一半

$ echo "${ARR[*]}"
entry1:entry2:entry3
$ echo $IFS

$ echo "$IFS"
:
Run Code Online (Sandbox Code Playgroud)

由于我无法理解这种行为,因此我认为这是一个错误。Bash 4.2可能与IFS更改有关

Joh*_*ica 5

$ echo $IFS

$ echo "$IFS"
:
Run Code Online (Sandbox Code Playgroud)

编写不带双引号的变量扩展会使其受到单词拆分(和通配符)的影响。单词拆分通过字符拆分字符串$IFS。在编写$var时,好像有一个隐藏的函数调用split+glob($var)

如果您考虑一下,写$IFS不带引号注定会失败。它$IFS被里面的字符分开$IFS。多么元。无论$IFS设置为什么,结果都是一个空字符串:

$ (IFS='abc'; echo $IFS)

$ (IFS='<>'; echo $IFS)

$ (IFS='!@#$'; echo $IFS)

Run Code Online (Sandbox Code Playgroud)

课程:总是引用变量扩展。

$ (IFS='abc'; echo "$IFS")
abc
$ (IFS='<>'; echo "$IFS")
<>
$ (IFS='!@#$'; echo "$IFS")
!@#$
Run Code Online (Sandbox Code Playgroud)