下面代码块中的三重小于号bash运算符<<<是什么意思?
<<<
LINE="7.6.5.4" IFS=. read -a ARRAY <<< "$LINE" echo "$IFS" echo "${ARRAY[@]}"
字符串另外,为什么$IFS仍然是空格,而不是句点?
$IFS
w8f9ii691#
它将字符串重定向到命令的stdin。以这种方式直接在命令前赋值的变量只对命令进程生效; shell 保持不变。
8gsdolmq2#
从man bashHere Strings一个变体的here文档,格式为:
man bash
<<<word
字符串该词被展开并提供给命令的标准输入。IFS行上的.相当于bash中的source。
.
source
**更新:**更多来自man bash(感谢gsklee,sehe)
IFS内部字段分隔符,用于扩展后的单词拆分,并使用read内置命令**将行拆分为单词。默认值为“<space><tab><new‐line>”。更多来自man bash任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时增强,如上文参数中所述。这些赋值语句只影响该命令所看到的环境。
<space><tab><new‐line>
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
型我不知道为什么第一种方法不是语法错误。
ars1skjm4#
只是为了提供一个更清晰的<<<示例,而不考虑read,当您这样做时:
read
mycmd <<< $myvar
字符串似乎相当于:
printf '%s\n' "$myvar" | mycmd
型其类似于:
echo "$myvar" | mycmd
型除了echo解释了一些反斜杠转义,因此可能会弄乱字符串。因此,我们看到<<<是一种将变量(或其他扩展)传递给命令的标准输入的方便而简洁的方法。作为一个具体的例子:
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,给出输出:
sed
A
A1 A3 A5
型
4条答案
按热度按时间w8f9ii691#
它将字符串重定向到命令的stdin。
以这种方式直接在命令前赋值的变量只对命令进程生效; shell 保持不变。
8gsdolmq2#
从
man bash
Here Strings一个变体的here文档,格式为:
字符串
该词被展开并提供给命令的标准输入。
IFS行上的
.
相当于bash中的source
。**更新:**更多来自
man bash
(感谢gsklee,sehe)IFS内部字段分隔符,用于扩展后的单词拆分,并使用read内置命令**将行拆分为单词。默认值为“
<space><tab><new‐line>
”。更多来自
man bash
任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时增强,如上文参数中所述。这些赋值语句只影响该命令所看到的环境。
slwdgvem3#
没有设置IFS的原因是bash没有将其视为一个单独的命令...你需要在命令后面放一个换行符或分号来终止它:
字符串
但是
型
我不知道为什么第一种方法不是语法错误。
ars1skjm4#
只是为了提供一个更清晰的
<<<
示例,而不考虑read
,当您这样做时:字符串
似乎相当于:
型
其类似于:
型
除了
echo
解释了一些反斜杠转义,因此可能会弄乱字符串。因此,我们看到
<<<
是一种将变量(或其他扩展)传递给命令的标准输入的方便而简洁的方法。作为一个具体的例子:
型
或者:
型
或者:
型
所有使用
sed
替换每行的第一个字母为A
,给出输出:型