命令行参数无法覆盖Bash函数内的--cell标志,问题出在哪?
问题解决:Bash脚本中命令行参数覆盖默认值的方法
你的问题和命令行格式无关,是脚本本身没处理传入的参数——当前脚本只是硬编码了默认的--cell=""到ARGS数组里,完全没用到你通过命令行传递的参数,自然不会覆盖。
下面提供两种可行的修改方案:
方案1:针对单个参数的简单处理
适合只有--cell这一个需要覆盖的参数的场景:
#!/bin/bash function main() { # 初始化默认的cell参数 local cell_arg="--cell=" # 遍历命令行传入的所有参数,找到--cell开头的项就替换默认值 for arg in "$@"; do if [[ $arg == --cell=* ]]; then cell_arg="$arg" break fi done # 构建最终参数数组 declare -a ARGS=( "$cell_arg" ) echo "${ARGS[@]}" } main "$@"
执行时直接传参数即可,不需要加额外的--:
bash launch_training.sh --cell=test
方案2:通用多参数覆盖逻辑
如果以后需要添加更多可配置的参数,用关联数组的方式更灵活:
#!/bin/bash function main() { # 用关联数组存储默认参数的键值对 declare -A DEFAULT_ARGS=( [cell]="" # 以后可以在这里加更多默认参数,比如[batch_size]="32" ) # 遍历命令行参数,覆盖对应键的值 for arg in "$@"; do if [[ $arg == --*=* ]]; then # 拆分参数的键和值 key="${arg#--}" key="${key%=*}" value="${arg#*=}" DEFAULT_ARGS[$key]="$value" fi done # 把关联数组转换成最终的命令行参数格式 declare -a ARGS=() for key in "${!DEFAULT_ARGS[@]}"; do ARGS+=( "--$key=${DEFAULT_ARGS[$key]}" ) done echo "${ARGS[@]}" } main "$@"
内容的提问来源于stack exchange,提问作者Victor M
相关产品推荐
相关产品推荐

