44

<<<下面的代码块中的三重小于号 bash 运算符 ,是什么意思?

LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"

另外,为什么$IFS仍然是一个空间,而不是一个句点?

4

3 回答 3

31

它将字符串重定向到命令的标准输入。

这种方式在命令前直接赋值的变量只对命令进程生效;外壳保持不变。

于 2011-10-31T05:38:09.487 回答
11

man bash

Here Strings here文档的一种变体,格式为:

     <<<word

该词被扩展并提供给其标准输入上的命令。

IFS行.上的 相当于sourcebash 中的。

更新:更多来自man bash(感谢 gsklee,sehe)

IFS 内部字段分隔符,用于扩展后的 分词,并使用 read 内置命令将行拆分为单词。默认值为“ <space><tab><new‐line>”。

还有更多来自man bash

任何简单命令或函数的环境都可以通过在其前面加上参数分配来临时扩充,如上文 PARAMETERS 中所述。这些赋值语句只影响该命令看到的环境。

于 2011-10-31T05:44:20.877 回答
3

未设置 IFS 的原因是 bash 没有将其视为单独的命令...您需要在命令后放置换行符或分号以终止它:

$ cat /tmp/ifs.sh
LINE="7.6.5.4"
IFS='.'  read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"

$ bash /tmp/ifs.sh 


7 6 5 4

$ cat /tmp/ifs.sh 
LINE="7.6.5.4"
IFS='.';  read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"

$ bash /tmp/ifs.sh 
.
7 6 5 4

我不确定为什么第一种方式不是语法错误。

于 2011-10-31T12:31:38.567 回答