我有一个函数,它接受一个可选的日期参数,并根据它进行计算。我试图确保如果没有提供该参数,则使用当前日期/时间作为默认值。我已经尝试了六种方法,但我还是继续
${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(
bash
,dash
,ksh
,zsh
,)。关于bash - 用日期替换参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35906067/