Bash脚本如何按位置序号命名参数 处理第4位后多文件参数变量
报错根因
Bash 解析赋值语法时不会先替换动态生成的变量名再执行赋值,bld$bldNum=${!numFile} 这段代码会被Bash直接当做名为 bld1=b1.bld 的命令去执行,因此抛出「command not found」报错。
修复方案1:使用printf -v(兼容性最好,Bash 3.0+支持)
printf 的 -v 参数支持直接将值写入指定名称的变量,天然支持动态生成的变量名,修改后的循环代码如下:
if [[ $# -lt 4 ]]; then echo "correct use is" echo "./UAT.sh input.inp expOut.exp actOut.act then whatever number of .bld files" else input=$1 exp=$2 act=$3 numFile=3 while [[ ${numFile} -lt $# ]]; do (( numFile++ )) bldNum=$((numFile - 3)) printf -v "bld$bldNum" %s "${!numFile}" done echo "bld1 is ${bld1}" echo "bld2 is ${bld2}" echo "bld3 is ${bld3}" fi
修复方案2:使用nameref名称引用(Bash 4.3+支持,写法更清晰)
通过declare -n给动态变量创建别名,直接操作别名即可完成赋值:
while [[ ${numFile} -lt $# ]]; do (( numFile++ )) bldNum=$((numFile - 3)) declare -n cur_bld="bld$bldNum" cur_bld="${!numFile}" # 取消绑定避免后续变量冲突 declare +n cur_bld done
更推荐的替代方案:用数组存储额外文件
不需要单独创建带序号的独立变量,直接把所有.bld文件存入数组,调用和遍历都更方便,代码更简洁:
if [[ $# -lt 4 ]]; then echo "correct use is" echo "./UAT.sh input.inp expOut.exp actOut.act then whatever number of .bld files" else input=$1 exp=$2 act=$3 # 直接提取第4位之后的所有参数存入数组 bld_arr=("${@:4}") echo "bld1 is ${bld_arr[0]}" echo "bld2 is ${bld_arr[1]}" echo "bld3 is ${bld_arr[2]}" fi
内容的提问来源于stack exchange,提问作者Corduroy J
相关产品推荐
相关产品推荐

