使用 cat 时不计算表达式

Jam*_*ton 6 bash

我有一个 bash 脚本,旨在输出另一个 bash 脚本。我在用cat。我想评估输出脚本中的一些表达式,而不是其他表达式。

PROJECT=myproject

cat << EOF > create_dir.sh
#!/usr/bin/env bash

DATE=`date '+%y%m%d-%H%M'`
mkdir $PROJECT/\$DATE
EOF
Run Code Online (Sandbox Code Playgroud)

生成的create_dir.sh文件如下所示:

#!/usr/bin/env bash

DATE=171123-1834

mkdir myproject/$DATE
Run Code Online (Sandbox Code Playgroud)

我想要的结果是这样的:

#!/usr/bin/env bash

DATE=`date '+%y%m%d-%H%M'`

mkdir myproject/$DATE
Run Code Online (Sandbox Code Playgroud)

如何修改此脚本,以便DATE=不评估后面的表达式,同时确保$PROJECT评估它?

小智 5

您需要转义“`”符号,因为它们的意思是“执行此代码”。所以该行应该如下所示:

DATE=\`date '+%y%m%d-%H%M'\`
Run Code Online (Sandbox Code Playgroud)

  • 我可能会建议使用 `$( ... )` 而不是 `` ` `` 以便只转义一个符号 `/$` (2认同)

Ale*_*exP 5

cat << \EOF

如果引用了标签,则此处的文档将按原样采用。或者引用此处文档中的反引号。

手册页的相关部分是:

如果word的任何部分被引用,则分隔符是对word 删除引号的结果,并且此处文档中的行不会扩展。如果word不加引号,则此处文档的所有行都会进行参数扩展、命令替换和算术扩展,字符序列 \<newline> 将被忽略,并且\必须用于引用字符\$`

请注意,此解决方案将逐字复制此处的文档;要完成一些扩展而另一些未完成,唯一的解决方案是使用\引用那些未扩展的结构。