我有一个 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> 将被忽略,并且\
必须使用引号字符\
、$
和`
。
请注意,此解决方案将逐字复制此处的文档;要完成一些扩展而其他扩展不完成,唯一的解决方案是引用\
那些未扩展的构造。