前言

shift是一条非常有用的命令。对于位置变量或命令行参数,其个数是确定的,可以把所有参数一起赋值给变量$*。位置参数用shift命令左移,将参数变量列表 list 左移指定次数,缺省为左移一次。参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。
shift n是指左移的数量,比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。


shift 语法

while 循环遍历位置变量或者命令行参量列表时,常用到 shift。

shift [n] 

shift是一条非常有用的命令。对于位置变量或命令行参数,其个数是确定的,可以把所有参数一起赋值给变量$*。位置参数用shift命令左移,将参数变量列表 list 左移指定次数,缺省为左移一次。参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。
shift n是指左移的数量,比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。

示例

  • 查看命令行参数
    shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位
#!/bin/bash
# Usage: args01.sh [args]
while (($# > 0)); do
	echo $*
	echo $#
	shift
done
[root@zaishu sh]# ./args01.sh a b c
a b c
3
b c
2
c
1
  • until 和 shift 命令计算所有命令行参数的和。
#!/bin/bash
# Usage: calc_sum.sh
if [ $# -eq 0 ]; then
	echo "Usage: $0 user1 user2 .."
	exit 1
fi

sum=0
until [ $# -eq 0 ]; do
	sum=$((sum+$1))
	shift
done

echo "sum is : $sum"
[root@zaishu sh]# ./calc_sum.sh 10 20
sum is : 30
  • 创建命令行上的所有用户
#!/bin/bash
# Usage: batch_create_user.sh
if [ $# -eq 0 ]; then
	echo "Usage: $0 user1 user2 .."
	exit 1
fi

while [ "$1" ] ; do
	if id $1 &>/dev/null; then
		echo $1 is exist
	else
		useradd $1
		echo "$1 is created"
	fi
	shift
done

echo "All user is created"
[root@zaishu sh]# ./batch_create_user.sh
Usage: ./batch_create_user.sh user1 user2 ..
[root@zaishu sh]# ./batch_create_user.sh  zha
zha is created
All user is created
[root@zaishu sh]# ./batch_create_user.sh  zha li
zha is exist
li is created
All user is created

总结

shift是一条非常有用的命令。对于位置变量或命令行参数,其个数是确定的,可以把所有参数一起赋值给变量$*。位置参数用shift命令左移,将参数变量列表 list 左移指定次数,缺省为左移一次。参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。
shift n是指左移的数量,比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。