如何在Bash中使用$*但忽略首个特殊参数?
解决方法
要忽略第一个参数并遍历剩余参数,bash里有几种实用的写法:
方法1:用shift命令移除第一个参数
shift命令会把参数列表整体左移一位,原本的$2变成$1、$3变成$2,后续再用$@就只会包含剩下的参数。修改后的脚本如下:
sum=0 # 移除第一个参数,让后续参数顺位前移 shift for i in "$@" do sum=$(($sum + $i)) done echo $sum
建议用"$@"代替$*,因为"$@"会保留参数里的空格(如果参数包含空格的话),避免被错误拆分。
方法2:直接从第二个参数开始遍历
如果不想改动原参数列表,可以用数组切片语法,直接取从第二个参数开始的所有内容:
sum=0 # ${@:2} 表示取第2个及之后的所有参数 for i in "${@:2}" do sum=$(($sum + $i)) done echo $sum
原脚本的问题说明
你原来的脚本有两个明显问题:
$*包含了所有参数,循环会把第一个参数也纳入计算,如果第一个参数是"+",执行加法时会因类型错误报错- 循环里的
[ $1 = "+" ]是一直判断第一个参数,而非当前循环的变量$i,逻辑不符合需求
如果你的需求是第一个参数作为运算符(比如"+"表示求和),可以调整成这样:
sum=0 operator=$1 shift for i in "$@" do if [ "$operator" = "+" ]; then sum=$(($sum + $i)) fi done echo $sum
内容的提问来源于stack exchange,提问作者LocalHandsomeEmo
相关产品推荐
相关产品推荐

