参数替换日期

时间:2016-03-10 01:41:01

标签: bash shell

我有一个带有可选日期参数的函数,并根据它进行计算。我正在尝试确保如果未提供该参数,则将当前日期/时间用作默认值。我试过这六种方法,但我一直回到

${testDate:=$(date)}

哪个有效。 testDate的值已正确设置,其余功能正常工作。但是,我收到一条错误消息:

Wed: command not found

(日期字符串为“Wed Mar 9 20:16:48 EST 2016”,截至目前)

我做错了什么?或者有更好的方法吗?

编辑:为了澄清,我正在模仿这个,在我的脚本的其他地方工作正常:

${menuTitle:=$"Choose from the Menu"}

我在顶部发布的行与此不同的具体情况如何?

2 个答案:

答案 0 :(得分:4)

这种情况下的典型方法是使用the null utility (builtin), :,因为它会扩展并忽略其参数:

: "${testDate:=$(date)}"  # double quotes not strictly required

虽然它在大多数情况下都不会产生影响,但双引号会消除不必要的附加扩展,例如路径名扩展和单词拆分。

即使扩展${testDate:=$(date)}扩展为$testDate的有效值 - 无论它是否具有先前的非空值还是刚刚初始化为date的输出 - {:忽略该值{1}},导致所需的条件初始化

如果没有:${testDate:=$(date)}用作语句本身,Bash会将扩展结果解释为命令,其中您的情况导致尝试从date执行输出作为命令,显然失败(第一个以空格分隔的标记Wed被解释为命令名称。)

请注意,上述内容与POSIX兼容,因此它不仅适用于Bash,而且适用于所有与POSIX兼容的主要shell(bashdashksh,{{ 1}})。

答案 1 :(得分:1)

问题是这一行:

${testDate:=$(date)}

不仅为testDate赋值,而且还对变量进行求值,并因此作为命令执行。

你可以这样做:

if [ -z "${testDate}" ]; then
    testDate=$(date)
fi

或者,作为一个单行:

[ -z "${testDate}" ] && testDate=$(date)