$ IFS $()是什么意思?

ano*_*ous 1 bash shell

正如标题所述,我很困惑$IFS$(),我在一个网站上看到它$IFS$()可以取代空白,但我不知道如何.谁能帮我?

rAl*_*len 5

通过$IFS$()它们可能意味着它们将IFS从默认空白区域更改为字符串结尾.

从bash联机帮助页:

IFS内部字段分隔符,用于扩展后的单词拆分,并使用read builtin命令将行拆分为单词.默认值为``<space><tab><newline>''.

它们意味着它们执行IFS=$()的操作与执行操作相同IFS=$'\0',声明字段分隔符为空字符,这标记字符串的结尾.

$() 表示在括号内返回命令的输出,这与您在终端中按Enter键相同.

例:

$ cat test
1 2 3 4 5   6    7
8 9
Run Code Online (Sandbox Code Playgroud)

它将每个数字作为新变量,因为每个空格(无论是单个空格,制表符还是新行都被视为字段分隔符)

$ for i in $(cat test); do echo $i; done
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

如果我们将IFS更改为$(),则输出与文件中的输出相同:

$ IFS=$();for i in $(cat test); do echo $i; done
1 2 3 4 5   6    7
8 9
Run Code Online (Sandbox Code Playgroud)

取消设置IFS,它会回到IFS看空白区域

$ unset IFS
$ for i in $(cat test); do echo $i; done
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

您可以类似地将IFS更改为null字符 $'\0'

$ IFS=$'\0';for i in $(cat test); do echo $i; done
1 2 3 4 5   6    7
8 9
Run Code Online (Sandbox Code Playgroud)

IFS=$()基本上和IFS=or 相同IFS="",你声明它等于空字符串,所以bash查找字符串结尾作为分隔符.

  • 对我来说`$()`不会产生换行符.`X = $(); printf%q"$ x"`prints`''``(空字符串)但是`x = $(); printf%q"$ x"`打印`$'\n'`(换行符).在你的例子中`IFS = $(); for ...`输出与文件中的输出相同,因为整个文件在一次迭代中被读取.`IFS = $()`与`IFS =""`或`IFS =`相同. (3认同)
  • 更好,但仍然有点误导.确实,字符串由空字符终止,但在bash中,您永远不能访问该空字符.它在内部处理.编写`$'\ 0'`实际上会产生一个包含两个空字符的字符串,你明确记下的字符串,并且一个bash会自动附加以标记字符串的结尾.但是,由于bash在第一个空字符处终止字符串,因此`$'\ 0'`,`""`或甚至`$'\ 0某些长字符串'之间没有区别. (2认同)