bash运算符<<<<意思是,在下面的代码块里面?为什么$ IFS仍然是一个空间,而不是一个时期呢?
LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
答案 0 :(得分:16)
它将字符串重定向到命令的stdin。
以这种方式直接在命令之前分配的变量仅对命令进程生效;外壳保持不变。
答案 1 :(得分:8)
来自man bash
这里的字符串 这里文档的变体,格式为:
<<<word
单词被扩展并在其标准输入上提供给命令。
IFS行上的 .
相当于bash中的source
。
更新:来自man bash
的更多信息(谢谢gsklee,sehe)
IFS内部字段分隔符,用于分词 在扩展之后,用将行分成单词与read 内置命令。默认值为“
<space><tab><new‐line>
”。
来自man bash
可以扩充任何简单命令或功能的环境 暂时通过为参数赋值添加前缀,如上所述 以上参数。这些赋值语句仅影响该命令所见的环境。
答案 2 :(得分:2)
未设置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
我不确定为什么第一种方式不是语法错误。