我有一个bash
脚本,需要从以下任一位置启动:
cron
- 交互式(登录)shell
此脚本需要知道它是从 启动的cron
,还是从交互式 shell 启动的。当我在 中声明环境变量时,我以为我已经解决了这个问题root crontab
:
RUN_BY_CRON="TRUE"
在脚本中,我测试RUN_BY_CRON
并使用结果来设置另一个变量:
if [ "$RUN_BY_CRON" = "TRUE" ]; then
((wait_time=DELAY_HALT*60))
fi
set -u
在我将其添加到脚本中(作为“常见的防御性编程策略” )之前,此方法一直有效。从那时起,当我从命令行运行脚本时,set -u
会标记RUN_BY_CRON
为“未绑定变量”错误:
$ sudo ./skedrtc.sh
./skedrtc.sh: line 24: RUN_BY_CRON: unbound variable
值得一提的是,我运行了shellcheck
这个脚本,没有收到任何警告或错误。
我尝试添加测试RUN_BY_CRON
,但得到了同样的错误。我尝试测试交互式 shell,但从脚本内部进行测试没有帮助:
...
if [ -z "$RUN_BY_CRON" ]; then # test for null string
RUN_BY_CRON="FALSE"
fi
...
if [[ $- == *i* ]]; then # test for interactive shell
RUN_BY_CRON="FALSE"
fi
这感觉就像是“第 22 条军规”的情况。我曾寻找过创建try-catch块的方法,但 AIUI 中没有类似的东西bash
。
您可能可以使用
${var-"string"}
以下语法,这意味着如果$var
未设置则返回“字符串”,否则返回$var
例如
现在如果我正常运行它:
因此没有错误,并且该值扩展为“默认”值。
但如果它设置的值:
即使变量已设置但为空,此方法也有效
如果您还想让它替换空字符串,那么请使用
:-
;一种常见的模式是让代码执行以下操作:
一开始就确保设置了默认值。