【问题标题】:What does the Bash operator <<< (i.e. triple less than sign) mean?Bash 运算符 <<< (即三倍小于号)是什么意思?
【发布时间】:2022-02-19 07:40:41
【问题描述】:

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

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

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

【问题讨论】:

  • 当您需要多个管道时,此运算符的另一种用法(而不是带有 mknod 的命名管道)|管道:例如。回波数据 |命令 --data-on-stdin --other-data-on-fd-3 3

标签: bash shell herestring


【解决方案1】:

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

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

【讨论】:

  • 如何修改它以使用自定义多字符分隔符?说,==&gt;?我应该如何引用字符串?
  • 你不能。 $IFS 总是被解释为一系列单个字符。
  • 但是当我想使用换行符分割数组时。只有第一项被添加到 hostArray。但主人有4个项目。 host=$(mysql -S $socket $catalog --skip-column-names -e "select host from mysql.user); echo "Host: $host"; IFS=$'\n';read -ra hostArray &lt;&lt;&lt; "$host"; echo "HostArray:$hostArray" #This prints only 1 item. But there are 4 items;这里有什么问题?
  • @Guna 我来晚了几年,但无论如何其他人可能会想知道......在这部分 &lt;&lt;&lt; "$host" 中,当您引用像 "$host" 这样的数组时,它意味着默认索引为零所以它真的在做"$host[0]"。你需要的是"${host[@]}"
【解决方案2】:

来自man bash

这里的字符串 这里文档的一种变体,格式为:

     <<<word

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

IFS 行上的. 相当于bash 中的source

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

IFS 用于分词的内部字段分隔符 扩展后 将行拆分为带有 read 的单词 内置命令。默认值为“&lt;space&gt;&lt;tab&gt;&lt;new‐line&gt;”。

更多来自man bash

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

【讨论】:

  • . 似乎是为$LINE 定义自定义分隔符的一种方式
【解决方案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

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

【讨论】:

  • 因为第一种方法是临时设置单个命令的环境变量。当该命令完成时,它们会自动重置回以前的值。我一直用它来设置调试标志或你有什么,但只是暂时的。
猜你喜欢
  • 2016-05-03
  • 2013-05-07
  • 1970-01-01
  • 2022-06-11
  • 2015-09-18
  • 2017-03-29
  • 2011-03-16
  • 2011-07-09
相关资源
最近更新 更多