如何在Bash中为可选变量通过三元运算设置默认值?
Bash中为可选变量设置默认值的实现方案
方法一:用参数展开模拟三元运算(处理完参数后补默认值)
Bash没有原生的三元运算符?:,但可以用参数展开语法实现「变量为空则用默认值」的效果,最常用的是${变量名:-默认值}:
- 如果变量为空/未定义,就使用冒号后的默认值
- 如果变量已有值,就保留原变量值
把这个语法加在参数处理循环之后,给可选变量设置默认值即可:
#!/bin/bash while getopts l:m:ch:eh:cate:op:b flag do case "${flag}" in l) localities=${OPTARG};; m) mode=${OPTARG};; ch) cbhost=${OPTARG};; eh) eshost=${OPTARG};; cate) category=${OPTARG};; op) outputDir=${OPTARG};; b) s3bucket=${OPTARG};; esac done # 为可选变量设置默认值 cbhost=${cbhost:-localhost} # 如果cbhost为空,默认设为localhost eshost=${eshost:-127.0.0.1:9200} # 如果eshost为空,默认设为127.0.0.1:9200
方法二:先设默认值,再用传入参数覆盖
更直观的方式是在脚本开头直接给可选变量赋值默认值,之后在getopts的处理逻辑中,当用户传入对应参数时自动覆盖默认值:
#!/bin/bash # 先设置默认值 cbhost="localhost" eshost="127.0.0.1:9200" while getopts l:m:ch:eh:cate:op:b flag do case "${flag}" in l) localities=${OPTARG};; m) mode=${OPTARG};; ch) cbhost=${OPTARG};; # 用户传-ch参数时覆盖默认值 eh) eshost=${OPTARG};; # 用户传-eh参数时覆盖默认值 cate) category=${OPTARG};; op) outputDir=${OPTARG};; b) s3bucket=${OPTARG};; esac done
补充说明
- 两种方法都能实现需求,方法二更适合需要明确展示默认值的场景,可读性更强
- 如果想区分「变量未定义」和「变量为空字符串」,可以用
${变量名:-默认值}和${变量名-默认值}的区别:前者在变量为空字符串时也会用默认值,后者只在变量未定义时用默认值
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

