我注意到它们之间存在一些区别:
在<<EOF
heredoc中,新值不能分配给变量:
bash <<EOF
s=fds
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)
将打印空行,在哪里
bash <<\EOF
s=fds
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)
将打印变量的值s
.
全局变量可以在内部访问<<EOF
但不在内部访问<<\EOF
(export
可以访问内部的变量<<\EOF
):
s=fds
bash <<EOF
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)
将打印值fds
,在哪里,
s=fds
bash <<\EOF
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)
将打印空行.
那么它们之间的区别是什么是合法的记录行为?
从POSIX规范:
如果引用单词中的任何字符,则应通过对单词执行引用删除来形成分隔符,并且不应扩展此文档行.否则,分隔符应为单词本身.
所以<<EOF
版本有shell 在运行这里的doc内容之前扩展所有变量,而<<\EOF
(<<'EOF'
或者<<EO'F'
等等)版本不扩展内容(bash
在这种情况下允许这样做).
尝试一下,cat
而不是bash
更清楚地了解正在发生的事情.
还有printf '[%s]\n' "$s"
和/或可能bash -x
代替bash
:
$ bash -x <<EOF
s=fds
printf '[%s]\n' "$s"
EOF
+ s=fds
+ printf '[%s]\n' ''
[]
$ bash -x <<\EOF
s=fds
printf '[%s]\n' "$s"
EOF
+ s=fds
+ printf '[%s]\n' fds
[fds]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1982 次 |
最近记录: |