我有一个带有可选日期参数的函数,并根据它进行计算。我正在尝试确保如果未提供该参数,则将当前日期/时间用作默认值。我试过这六种方法,但我一直回到
${testDate:=$(date)}
哪个有效。 testDate的值已正确设置,其余功能正常工作。但是,我收到一条错误消息:
Wed: command not found
(日期字符串为“Wed Mar 9 20:16:48 EST 2016”,截至目前)
我做错了什么?或者有更好的方法吗?
编辑:为了澄清,我正在模仿这个,在我的脚本的其他地方工作正常:
${menuTitle:=$"Choose from the Menu"}
我在顶部发布的行与此不同的具体情况如何?
答案 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(bash
,dash
,ksh
,{{ 1}})。
答案 1 :(得分:1)
问题是这一行:
${testDate:=$(date)}
不仅为testDate
赋值,而且还对变量进行求值,并因此作为命令执行。
你可以这样做:
if [ -z "${testDate}" ]; then
testDate=$(date)
fi
或者,作为一个单行:
[ -z "${testDate}" ] && testDate=$(date)