调用shell脚本时能否为指定位置参数直接赋值?
Shell脚本指定位置参数调用问题解答
结论先行
你描述的./train-rnn.sh $1=0 $2=0 $4=0 $3="63 512"调用形式无法实现指定位置参数赋值的需求。
原因说明
Shell中的位置参数$1、$2...$N是按照参数传入的顺序自动赋值的,你写的$1=0这类内容会被识别为普通字符串参数传递给脚本:调用后脚本内的$1实际值是字符串$1=0,$2实际值是字符串$2=0,和你想要的效果完全不符。
可行的替代方案
这里给出3种不同场景下的解决方案,按推荐优先级排序:
- 方案1:改写脚本支持命名参数(多参数场景最优)
用getopt工具在脚本内增加命名参数解析逻辑,之后你可以完全不关心参数顺序,用可读性更高的形式传参,示例调用形式如下:
你可以把以下片段加到./train-rnn.sh --gpu-id 0 --param-a 0 --param-b 0 --input-size "63 512"train-rnn.sh开头实现基础的命名参数解析:# 命名参数解析逻辑 ARGS=$(getopt -o '' --long gpu-id:,param-a:,param-b:,input-size: -- "$@") eval set -- "$ARGS" while true; do case "$1" in --gpu-id) GPU_ID="$2"; shift 2 ;; --param-a) PARAM_A="$2"; shift 2 ;; --param-b) PARAM_B="$2"; shift 2 ;; --input-size) INPUT_SIZE="$2"; shift 2 ;; --) shift; break ;; *) echo "无效参数,请检查输入"; exit 1 ;; esac done # 后续脚本逻辑直接使用$GPU_ID、$PARAM_A等变量即可 - 方案2:按顺序补全参数(不改写原有脚本)
如果你不想修改现有脚本的逻辑,直接按照位置顺序传参即可,你示例的需求对应的调用命令为:
如果中间某个位置的参数需要用脚本默认值,传对应的默认值占位即可。./train-rnn.sh 0 0 "63 512" 0 - 方案3:数组预定义参数(适用于参数动态生成的场景)
如果你需要动态给不同位置的参数赋值,可以先定义数组再批量传递,示例如下:# 按位置索引赋值,数组索引0对应脚本的$1,索引1对应$2,以此类推 params=() params[0]=0 params[1]=0 params[2]="63 512" params[3]=0 # 调用脚本 ./train-rnn.sh "${params[@]}"
内容的提问来源于stack exchange,提问作者Kong
相关产品推荐
相关产品推荐

