求助:Bash脚本中部分带默认值的参数无法按用户输入更新
Bash脚本可选参数无法更新问题排查
你遇到的问题是:脚本中部分多字符参数(如res、reg)无法通过用户输入覆盖默认值,而单字符参数(d、b)可以正常工作。比如执行bash preprocessingPipeline.sh -reg 0后,REGISTRATION仍保持默认值1。
问题根源
Bash内置的getopts工具仅支持单字符选项,你在getopts ":s:d:b:res:reg:h:"中写的res、reg会被拆解成单个字符解析:比如-reg会被识别为三个独立选项-r、-e、-g,根本匹配不到case分支里的reg标签,自然无法更新对应变量。而d、b是单字符选项,所以能正常匹配。
解决方案
方案1:改用单字符短选项(推荐新手使用)
把多字符参数改成单字符,修改getopts选项字符串和对应的case分支:
修改后的脚本片段:
# default values DIM=3 BIASFIELDCORRECTION=1 SKULLSTRIPPING=0 REGISTRATION=1 RESAMPLRES=0 # reading command line arguments while getopts ":s:d:b:r:R:h" OPT do case $OPT in h) #help Help exit 0 ;; d) # dimension DIM=$OPTARG ;; b) # bias field correction BIASFIELDCORRECTION=$OPTARG ;; s) # skull stripping SKULLSTRIPPING=$OPTARG ;; r) # resampling resolution RESAMPLRES=$OPTARG ;; R) # registration REGISTRATION=$OPTARG ;; \?) # getopts issues an error message exit 1 ;; esac done echo "Registration:" $REGISTRATION
现在执行bash preprocessingPipeline.sh -R 0,就能正常将REGISTRATION的值更新为0。
方案2:使用GNU getopt支持长选项
如果坚持要用长选项(如--reg),可以使用GNU版本的getopt(注意不是内置的getopts),示例逻辑大致如下:
# 解析长选项 OPTIONS=$(getopt -o s:d:b:r:R:h --long res:,reg:,help -- "$@") eval set -- "$OPTIONS" while true; do case "$1" in -s|--skullstrip) SKULLSTRIPPING="$2" shift 2 ;; -d|--dimension) DIM="$2" shift 2 ;; -b|--bias) BIASFIELDCORRECTION="$2" shift 2 ;; -r|--res) RESAMPLRES="$2" shift 2 ;; -R|--reg) REGISTRATION="$2" shift 2 ;; -h|--help) Help exit 0 ;; --) shift break ;; *) exit 1 ;; esac done
执行时可以用bash preprocessingPipeline.sh --reg 0或者-R 0两种方式。
内容的提问来源于stack exchange,提问作者Barbara Gendron
相关产品推荐
相关产品推荐

