我正在为一位没有bash经验的朋友写剧本。该脚本生成备份脚本,生成crontab并运行crontab以创建cron作业。
我想约会这些备份,所以目前脚本(相关内容)是:
cat <<EOF > ~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
EOF
然而,这会生成finalCutScript.bash
,其中包含运行“installer”脚本时的日期。
有没有办法在finalCutScript.bash
内准确放置heredoc?我希望将所有内容保存在一个脚本中,以便以后可以使用此脚本框架。
预期行为:
我希望heredoc管道的文件包含
mkdir -p ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-`date +%a-%b-%d-%Y_%H`
实际行为
该heredoc生成的文件包含
mkdir -p ~/scheduledBackups/FinalCut-Fri-Aug-05-2016_16
cp -r ~/Documents//* ~/scheduledBackups/FinalCut-Fri-Aug-05-2016_16
答案 0 :(得分:4)
你应该在{heredoc中EOF
并使用$(...)
进行命令替换:
cat <<-'EOF' >~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-$(date +%a-%b-%d-%Y_%H)
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-$(date +%a-%b-%d-%Y_%H)
EOF
更新:根据下面的OP评论,您还可以转义$
以便不在当前shell中展开变量:
BACKUP_DIR='foobar' # variable to be used below in here-doc
cat <<-EOF >~/scheduledBackups/scripts/finalCutScript.bash
mkdir -p ~/scheduledBackups/FinalCut-\$(date +%a-%b-%d-%Y_%H)
cp -r $BACKUP_DIR/* ~/scheduledBackups/FinalCut-\$(date +%a-%b-%d-%Y_%H)
EOF
以上命令将使用当前环境中的$BACKUP_DIR
,但会在输出中添加文字$(date +%a-%b-%d-%Y_%H)
。