shell脚本中左移参数shift的使用
一、 shift 参数左移指令
shift 命令用于对参数的左移,通常用于在不知道传入参数个数的情况下一次遍历每个参数然后进行相应处理。
在扫描处理脚本程序的参数时,经常要用到的shift 命令,如果你的脚本需要10个或者10个以上的参数,你就要用shift 命令来访问第10个及以后的参数。
- 作用
每执行一次,参数序列顺序左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用。
- 补充位置参数:
位置参数,从命令行传递给脚本,或者传递给函数,或者set给变量
表示方法: $0 ,$1 , $2 , $3 ...等等 (注意:$9以后应该为$[10],$[11]....)
例如: $1 $2 $3 $4 $5
shell 范例1: 依次读取输入的参数,并打印出参数个数
[[email protected] ~]# vim shift.sh
1 #!/bin/bash
2 while [ $# != 0 ]
3 do
4 echo "第一个参数为:$1,参数个数为:$#"
5 shift
6 done
解析: 从上面结果可以看到: shift (shift 1)命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁之后的$2就变成了$1),而变量值提前一位。
同理,shift n后,前n位参数都会被销毁,比如我们输入了5个参数为:a、 b、 c 、d、 e,那么对应的位置变量为:$1=a, $2=b,$3=c,$4=d,$5=e, 我们在执行shift 3之后, 前面的3个参数a、b 、c 会被销毁,就剩下了2个参数:d、e,这时对就的位置变量为: $1=d、$2=e, 其中d由$4—>$1,e由$5—>$2
shell 范例2:
[[email protected] ~]# vim case2.sh
1 #!/bin/bash
3 echo "参数个数为: $# 其中:"
4 for i in $(seq $#)
5 do
6 eval j=\$$i #evel 命令可以用来显示传递给脚本的最后一个参数,该命令适用于那些一次> 扫描无法实现其功能的变量,它对它后面跟的命令会执行两次扫描,第一次把 \ 去掉,第二次扫描时> 会把$i 的值替换掉,假如这时$i 的值为$1, 那么代表第一个位置参数,即i=a
7 echo "第$i个参数($"$i"):$j"
8 done
9
10 shift 3
11 echo "执行shift 3之后:"
12 echo "参数个数为:$# 其中:"
13
14 for i in `seq $#`
15 do
16 eval j=\$$i
17 echo "第$i个参数($"$i"):$j"
18 done
shell 范例3: 做一个加法计算器, 求出所有参数的和
参数如下: 10 16 18 21 ,依次对应的位置变量为 $1 $2 $3 $4
[[email protected] ~]# vim case3.sh
#!/bin/bash
#首先确认是否有参数
if [ $# -le 0 ]
then
echo "没有足够的参数存在"
exit 124
fi
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
[[email protected] ~]#