使用 here-document 从 Bash 脚本创建脚本;为什么我的变量被替换了?

gdm*_*gdm 6 bash here-document variable

我在从主脚本创建脚本时遇到问题:

就这么简单:

cat  pippo << EOF
LOGFILE=test.log    
echo '#############################' >> $LOGFILE
EOF
Run Code Online (Sandbox Code Playgroud)

. 但是,当我检查 pippo 时,我得到:

LOGFILE=test.log
echo '#############################' >>
EOF
Run Code Online (Sandbox Code Playgroud)

为什么 $LOGFILE 已被替换?

hee*_*ayl 10

默认情况下,此处记录了 shell 扩展、精确参数扩展、命令替换和算术扩展的主题。所以在你的情况下发生了变量(参数)扩展——变量LOGFILE正在当前 shell 中扩展,并且由于该变量可能不存在,因此 null 作为扩展值被返回(并替换)。

要在此处的文档中逐字获取 shell 元字符,请在终止符字符串周围使用引号:

cat pippo <<'EOF'  ## "EOF" would do too
LOGFILE=test.log    
echo '#############################' >>"$LOGFILE"
EOF
Run Code Online (Sandbox Code Playgroud)

还将变量扩展引用为(大概)它引用文件名,以便在扩展后不会对其进行分词和路径名扩展。

  • 来自 [Bash ref → 3.6.6 Here Documents](https://www.gnu.org/software/bash/manual/bashref.html#Here-Documents) _如果单词未加引号,则此处文档的所有行均受到参数扩展、命令替换和算术扩展..._。 (2认同)