使用 cat 时不评估表达式

使用 cat 时不评估表达式

我有一个 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

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

#!/usr/bin/env bash

DATE=171123-1834

mkdir myproject/$DATE

我想要的结果是这样的:

#!/usr/bin/env bash

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

mkdir myproject/$DATE

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

答案1

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

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

答案2

cat << \EOF

如果标签被引用,则此处的文档将按原样执行。否则,引用此处文档中的反引号。

相关部分手册页是:

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

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

相关内容