无法在 bash 脚本中的 heredoc 中打印日期命令

无法在 bash 脚本中的 heredoc 中打印日期命令

我正在尝试编写一个 bash 脚本来自动打印日期命令,但不幸的是,它不起作用。

这是脚本的片段...我已经按照大多数建议使用了“EOF”,但仍然不起作用。

#!/bin/bash
cat<<'EOF'>/etc/yum.repos.d/local.repo
[local]
name=Red Hat Enterprise Linux $releasever - $basearch - Base
baseurl=file:///home/user1/updates-$(date +%d%b%y)
gpgcheck=0
enabled=1
EOF

有人可以帮忙吗?

答案1

不要引用您的此处文档。引用初始EOF标记(的任何部分)将阻止 shell 执行文档中的任何扩展。自从你shell 来处理周围的命令替换date,您需要将文档保留为不带引号的。

如果您想要$releasever且未$basearch展开,则需要对其$前面的进行转义,如下所示:

#!/bin/sh
cat <<EOF >/etc/yum.repos.d/local.repo
[local]
name=Red Hat Enterprise Linux \$releasever - \$basearch - Base
baseurl=file:///home/user1/updates-$(date +%d%b%y)
gpgcheck=0
enabled=1
EOF

另请注意,该脚本最好由其执行,/bin/sh因为它不包含任何bash特定内容。

如果您要创建的文件是 TOML 文件,您也可以像这样创建它:

tomlq -n -t \
    --arg name 'Red Hat Enterprise Linux $releasever - $basearch - Base' \
    --arg baseurl "file:///home/user1/updates-$(date +%d%b%y)" \
    --argjson gpgcheck 0 \
    --argjson enabled 1 \
    '.local = $ARGS.named' >/etc/yum.repos.d/local.repo

这使用tomlqTOML 解析器包装器around jq) 并创建 TOML 输出

[local]
name = "Red Hat Enterprise Linux $releasever - $basearch - Base"
baseurl = "file:///home/user1/updates-29May22"
gpgcheck = 0
enabled = 1

答案2

好吧,我想我找到了答案......我错误地使用了“”。所以我修改了脚本如下。

#!/bin/bash
cat<<EOF>/etc/yum.repos.d/local.repo
[local]
name=Red Hat Enterprise Linux \$releasever - \$basearch - Base
baseurl=file:///home/user1/updates-$(date +%d%b%y)
gpgcheck=0
enabled=1
EOF

相关内容