shell Bash操作符< (即三倍小于符号)的意思?

kd3sttzy  于 2023-08-07  发布在  Shell
关注(0)|答案(4)|浏览(153)

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

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

字符串
另外,为什么$IFS仍然是空格,而不是句点?

w8f9ii69

w8f9ii691#

它将字符串重定向到命令的stdin。
以这种方式直接在命令前赋值的变量只对命令进程生效; shell 保持不变。

8gsdolmq

8gsdolmq2#

man bash
Here Strings一个变体的here文档,格式为:

<<<word

字符串
该词被展开并提供给命令的标准输入。
IFS行上的.相当于bash中的source

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

IFS内部字段分隔符,用于扩展后的单词拆分,并使用read内置命令**将行拆分为单词。默认值为“<space><tab><new‐line>”。
更多来自man bash
任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时增强,如上文参数中所述。这些赋值语句只影响该命令所看到的环境。

slwdgvem

slwdgvem3#

没有设置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


我不知道为什么第一种方法不是语法错误。

ars1skjm

ars1skjm4#

只是为了提供一个更清晰的<<<示例,而不考虑read,当您这样做时:

mycmd <<< $myvar

字符串
似乎相当于:

printf '%s\n' "$myvar" | mycmd


其类似于:

echo "$myvar" | mycmd


除了echo解释了一些反斜杠转义,因此可能会弄乱字符串。
因此,我们看到<<<是一种将变量(或其他扩展)传递给命令的标准输入的方便而简洁的方法。
作为一个具体的例子:

myvar="$(printf '01\n23\n45')"
sed 's/./A/' <<< $myvar


或者:

sed 's/./A/' <<< $'01\n23\n45'


或者:

myvar="$(printf '01\n23\n45')"
printf '%s\n' "$myvar" | sed 's/./A/'


所有使用sed替换每行的第一个字母为A,给出输出:

A1
A3
A5

相关问题