使用 'read' 的多变量赋值在 bash v4.3.48 中有效,在 v4.4.7 中无效
Multiple variable assignment using 'read' works in bash v4.3.48 and does not in v4.4.7
我正在使用两个发行版,它们使用 bash v4.3.48 和 v4.4.7。
read VAR1 VAR2 <<< $(echo 0 ; echo 1)
echo $VAR2
对于bash v4.3.48,上述命令的结果是$VAR2 的值为1。
但是,对于 bash 4.4.7,$VAR2 为空。
为了得到相同的结果,在 4.4.7 中,我必须修改脚本:
read VAR1 VAR2 <<< $(echo -n $(echo 0 ; echo 1) )
我不知道我的(以前的)脚本是错误的,还是较新的 bash。
扩展 <<< $( )
时的行为似乎略有变化。通常,当 $( )
出现时没有双引号,结果会进行分词和通配符扩展。但是当它在 <<<
之后时,bash
的早期版本似乎跳过了通配符扩展部分,而是对其进行分词,然后将结果与空格一起粘贴回去。您可以使用 cat
而不是 read
:
来查看
$ echo $BASH_VERSION
4.2.10(1)-release
$ cat <<< $(echo 0; echo 1)
0 1
$ cat <<< $(echo '* *'; echo 1)
* * 1
请注意,'* *' 中的多余空格已消失,并且两个 echo
ed 字符串之间的换行符已变成空格,但通配符并未扩展为文件列表.结果,当您使用 read VAR1 VAR2 <<< $(echo 0 ; echo 1)
时,read
收到“0 1”并将这些数字放入两个变量中。
另一方面,bash
的较新版本也跳过了单词拆分:
$ echo $BASH_VERSION
4.4.12(1)-release
$ cat <<< $(echo 0; echo 1)
0
1
$ cat <<< $(echo '* *'; echo 1)
* *
1
这意味着当你使用read VAR1 VAR2 <<< $(echo 0 ; echo 1)
时,read
命令接收到两行:“0”和“1”,但它只读取一行 ("0"),因此只有 $VAR1
得到一个值。
更新: spotted the change in the release notes for bash-4.4-beta:
z. Bash no longer splits the expansion of here-strings, as the
documentation
has always said.
我正在使用两个发行版,它们使用 bash v4.3.48 和 v4.4.7。
read VAR1 VAR2 <<< $(echo 0 ; echo 1)
echo $VAR2
对于bash v4.3.48,上述命令的结果是$VAR2 的值为1。 但是,对于 bash 4.4.7,$VAR2 为空。
为了得到相同的结果,在 4.4.7 中,我必须修改脚本:
read VAR1 VAR2 <<< $(echo -n $(echo 0 ; echo 1) )
我不知道我的(以前的)脚本是错误的,还是较新的 bash。
扩展 <<< $( )
时的行为似乎略有变化。通常,当 $( )
出现时没有双引号,结果会进行分词和通配符扩展。但是当它在 <<<
之后时,bash
的早期版本似乎跳过了通配符扩展部分,而是对其进行分词,然后将结果与空格一起粘贴回去。您可以使用 cat
而不是 read
:
$ echo $BASH_VERSION
4.2.10(1)-release
$ cat <<< $(echo 0; echo 1)
0 1
$ cat <<< $(echo '* *'; echo 1)
* * 1
请注意,'* *' 中的多余空格已消失,并且两个 echo
ed 字符串之间的换行符已变成空格,但通配符并未扩展为文件列表.结果,当您使用 read VAR1 VAR2 <<< $(echo 0 ; echo 1)
时,read
收到“0 1”并将这些数字放入两个变量中。
另一方面,bash
的较新版本也跳过了单词拆分:
$ echo $BASH_VERSION
4.4.12(1)-release
$ cat <<< $(echo 0; echo 1)
0
1
$ cat <<< $(echo '* *'; echo 1)
* *
1
这意味着当你使用read VAR1 VAR2 <<< $(echo 0 ; echo 1)
时,read
命令接收到两行:“0”和“1”,但它只读取一行 ("0"),因此只有 $VAR1
得到一个值。
更新:
z. Bash no longer splits the expansion of here-strings, as the documentation has always said.