使用扩展变量解析命令

使用扩展变量解析命令

试图测试一些东西,但无论我尝试过什么方法,都没有完全解决它,所以不确定我是否愚蠢。

本质上,我需要将字符串解析为 ipa-getcert 的保存后参数,其中应包括证书续订的年份。这意味着该脚本将运行一次来​​请求证书,然后可以使用当前年份(简单)。但是,当 ipa-getcert 续订证书时,它将运行带有保存后参数的命令,此时必须使用续订年份。获取颁发的证书的整个字符串(包括保存后选项 [-C])是:

sudo ipa-getcert request -N $CERT_CN -K HTTP/$CERT_CN -k /etc/ssl/private/${CERT_CN}.key -f /etc/ssl/certs/${CERT_CN}.crt \
-D $CERT_CN -C "$INST_CERT -n ${CERT_NAME}_"'$(date +"%Y")'" $INST_OPTS $PAN_MGMT"

为了测试这一点,我尝试了以下操作,但日期从未扩展。除了使用 ipa-getcert 进行测试之外,还有更好的方法来测试吗?

$ txt="The year is: "
$ echo $txt$(date +"%Y")
The year is: 2023
$ echo $txt'$(date +"%Y")'
The year is: $(date +"%Y")
$ echo $(echo $txt'$(date +"%Y")')
The year is: $(date +"%Y")

但回显字符串确实如此,因此即使未打印在屏幕上,单引号似乎仍然保留。

$ echo The year is: $(date +"%Y")
The year is: 2023

毫无疑问,我在这里遗漏了一些微不足道的东西。

[编辑:]但是接下来的工作正常,所以也许我只是偏执?

$ mkdir $(date +"%Y")
$ test2="ll "'$(date +"%Y")'
$ echo $test2
ll $(date +"%Y")
$ eval $test2
total 8
drwxrwxr-x  2 user group 4096 Apr 24 20:01 ./
drwxr-xr-x 13 user group 4096 Apr 24 20:01 ../

答案1

shell 不会解析 shell 语法的扩展结果。这不是纯文本替换。对于引号、其他扩展、shell 运算符和 shell 关键字来说都是如此,但扩展的结果无法识别这些内容。因此,如果变量包含美元符号和一些括号,那么您将得到一个美元符号和一些括号。

如果您希望在运行时进行扩展,请将命令存储在函数中:

renew() {
    "$INST_CERT" -n "${CERT_NAME}_$(date +"%Y")" $INST_OPTS "$PAN_MGMT"
}

请小心引用您在此处扩展的变量,或者如果您依赖于分词,请更加小心以确保它符合您的要求。

相关/另见:我们如何运行存储在变量中的命令?

答案2

我认为您需要删除这样的引号:

RENEW_CMD="$INST_CERT -n ${CERT_NAME}_$(date +%Y) $INST_OPTS $PAN_MGMT"

例子:

FILE="example"
FILE2="year"
RND="randomvar"
REZ="$FILE ${FILE2}_$(date +%Y) $RND" 
echo "$REZ"

结果:

example year_2023 randomvar

相关内容