我有一个函数,它接受一个可选的日期参数,并根据它进行计算。我试图确保如果没有提供该参数,则使用当前日期/时间作为默认值。我已经尝试了六种方法,但我还是继续

${testDate:=$(date)}

这很管用。testDate的值设置正确,函数的其余部分工作正常。但是,我得到一条错误消息:
Wed: command not found

(日期字符串为“2016年3月9日星期三东部时间20:16:48”,截至目前)
我做错什么了?还是有更好的办法?
编辑:为了澄清这一点,我正在模仿这一点,这在我的剧本中的其他地方也很好:
${menuTitle:=$"Choose from the Menu"}

我贴在最上面的那一行和这一行有多特别?

最佳答案

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

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

虽然在大多数情况下不会有什么不同,但双引号消除了不必要的额外扩展,如路径名扩展和单词拆分。
即使expansion${testDate:=$(date)}扩展到$testDate的有效值,无论它是否具有以前的非空值,或者只是初始化为date的输出,该值都被:忽略,从而仅导致所需的条件初始化。
如果不使用:,而使用${testDate:=$(date)}本身作为语句,Bash会将扩展结果解释为命令,这在您的示例中会导致尝试将date的输出执行为命令,但显然失败了(第一个空格分隔的标记Wed被解释为命令名)。
注意,上面的代码与POSIX兼容,因此它不仅适用于Bash,而且适用于所有主要的POSIX兼容shell(bashdashkshzsh,)。

关于bash - 用日期替换参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35906067/

10-11 23:19
查看更多