Shell脚本中使用${@:3}后如何正常读取后续位置参数
问题原因
${@:3} 是Shell内置的参数扩展语法,作用是读取从第3个位置参数开始的全部剩余参数,这是语法的固有特性。你当前的写法逻辑上存在冲突:既让DATA接收第3位后的所有参数,又希望第4位单独赋值给DATAVERSION,原生不支持这种用法。
可行解决方案(保留${@:3}赋值逻辑)
方案1:传参时将DATA的所有内容包裹为单个参数
如果你只是需要把DATA的内容作为整体使用,不需要拆分内部参数,传参时把所有要放入DATA的内容用双引号包裹,作为第3个位置参数即可:
# 示例:DATA包含csv、txt两个内容,包裹后第4位的V1可被正常读取 ./abc.sh "name" "password" "csv txt" V1
此时${@:3}只会读取到第3位的完整包裹内容,第4位的V1可以正常被DATAVERSION="$4"捕获。
方案2:调整参数顺序,固定参数前置
如果你需要DATA保留接收多个独立参数的能力,只需要调整固定参数的顺序,把所有定长参数放在前面,不定长的DATA放在最后,不需要修改${@:3}的语法,仅调整变量赋值顺序即可:
# 调整后的脚本变量定义,固定参数全部前置 USERNAME="$1" PASSWORD="$2" DATAVERSION="$3" DATA="${@:4}"
传参时对应调整参数顺序即可:
./abc.sh "name" "password" V1 csv txt 其他需要传入DATA的参数
内容的提问来源于stack exchange,提问作者Dharmesh Mehta
相关产品推荐
相关产品推荐

