BASH检查环境变量存在时如何不输出变量值、支持多变量校验
Shell环境变量非空校验的简洁实现方案
解决「变量存在时打印变量值」的问题
你之前的写法用了echo命令,所以变量合法时会把值打印到终端。实际上不需要调用echo,直接使用Shell内置的空命令:即可:
: "${x:?You must set x variable, please see readme.md on how to get & set this variable.}"
:是POSIX标准内置命令,本身不产生任何输出、不执行任何操作,仅会完成传入参数的展开逻辑:
- 如果变量
x未设置,或者值为空串,Shell会自动将你写的错误信息输出到标准错误流,并以非0状态码退出脚本,和你最初写的if判断逻辑完全一致 - 如果变量
x已设置且非空,这行命令不会产生任何输出,也不会有额外副作用
补充:如果你的需求是仅校验变量是否被设置、允许变量值为空,可以去掉冒号,写成
"${x?错误提示}"即可。
多变量同时校验的实现
Shell原生的${参数:?提示}展开语法,不支持在单个展开表达式中同时校验多个变量,你写的${x,y:?}属于无效语法。
要实现多变量校验,可以根据场景选两种写法:
- 变量数量少的时候,逐行写校验语句即可,逻辑直观可读性强:
: "${x:?You must set x variable, please see readme.md on how to get & set this variable.}" : "${y:?You must set y variable, please see readme.md on how to get & set this variable.}"
- 待校验变量数量较多时,可以通过循环批量校验,减少重复代码:
# 括号内填写所有需要校验非空的变量名 for var_name in x y z; do : "${!var_name:?You must set $var_name variable, please see readme.md on how to get & set this variable.}" done
这里的${!var_name}是Shell的间接引用语法,会读取var_name存储的变量名对应的实际变量值,常见Shell(bash、zsh等)都支持该写法。
内容的提问来源于stack exchange,提问作者MadSandwich
相关产品推荐
相关产品推荐

