shift 命令时bash的内建命令.
命令的使用:
对于某个命令行参数,其参数个数可以不固定,但是可以通过$*或$@进行循环操作。(注释:$@,$* 表示所有参数的列表.$#表示参数的个数.)
若用户要求Shell在不知道变量个数的情况下,还能逐个处理参数,也就是在$1之后是$2,$2之后是$3。在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的$1变得不可用,通过$#命令获得的参数个数也会少1。我的理解是可以将所有的参数看成是在一个数组中,最开始的指针指向第一个参数,调用shift,相当于调用循环数组的next函数,将指针指向下一个元素,那么当前元素就是第二个元素.
shift [n]这里是可以带参数的.
官方文档是这样的:位置参数从n+1 被命名为为$1,参赛在$#-n+1的以下的都被unset(释放了.)其中 n必须是非负数.并且小于等于$#.
如果n=0,没有参数被改变.如果n没有指定,默认是1.如果n>$#,位置参数也不会被改变.
如果n>$# || n < 0 返回值大于0.
这里的官方文档通过数学的语言来描述,其实和上面的类似.
下面我们还是用例子来说明比较有说服力.
#!/bin/sh
echo "all parameters count:"$#
echo "all parameters"
echo $@
until [ $# -eq 0 ]
do
echo "the first parameter is :$1 and parameters count :$#"
shift 1
done
all parameters count:4
all parameters2 3 4 6
the first parameter is :2 and parameters count :4
the first parameter is :3 and parameters count :3
the first parameter is :4 and parameters count :2
the first parameter is :6 and parameters count :1
我们知道,$1-$9能够代表9个参数.$0代表文件名本身.
这里可以解决一个问题,如果是参数多余9个呢.shift 就能帮上大忙了.
另外的一个例子:
#!/bin/sh
function usage(){
echo "usage:`basename $0` [-l|-u] file..." >&2
exit 1
}
if [ $# -eq 0 ];then
usage
fi
while [ $# -ne 0 ]
do
case $1 in
-l|-L) echo "-l or -L is specified"
;;
-u|-U) echo "-u or -U is specified"
;;
*) usage
;;
esac
done
这里的结果大家应该猜测得到了.就不贴出来了.