当命令行参数接受用户的输入时,第一个参数包含脚本名称。有时为了编程的目的,需要省略脚本的名字。这个任务可以通过使用bash中的任何循环来轻松完成。使用`shift`命令是完成这项任务的另一种方法。这个命令是用来把一个位置参数默认移到左边的。在本教程中介绍了`shift`命令在bash中的不同用法。
语法
下面是`shift`命令的语法。该命令有一个可选的参数,用于设置向左移动的位置数。该参数必须是正数。如果参数值被设置为0,那么没有命令行参数将被移位。如果没有使用参数,那么默认情况下,一个命令行参数将被移位。
shift [n]
例1:打印所有的命令行参数值
用下面的脚本创建一个bash文件,用不带 "shift "命令的 "for "循环和带 "shift "命令的 "while "循环打印命令行参数值。每个参数值 都将被存储在变量中,当for 循环执行时,这个变量将被打印。start 变量在while 循环中使用`shift`命令来读取每个参数值,当所有的命令行参数被打印出来时终止循环。脚本中使用了一个计数器变量, **i,**来显示参数的数量。如果在执行时没有给出命令行参数,那么第一个参数将被设置为空字符串,并且不会打印任何东西。
#!/bin/bash
#Print the command-line aegument values using for and while loop
#Set the counter
i=1
echo "The argument values without shift command:"
#Iterate all values using for loop
for value in"$@"
do
echo "Argument no. $i = $value"
((i++))
done
#Re-initialize the counter
i=1
#Set the optional argument
start=${1:-""}
echo "The argument values by using shift command:"
#Iterate all values using while loop
while [ "$start" != "" ];
do
echo "Argument no. $i = $start"
#Shift each argument by 1
shift
start=$1
((i++))
done
输出
根据下面的输出,上述脚本已经用三个命令行参数值执行了。使用for循环和while循环与`shift`命令,参数值被打印了两次。

例2:打印偶数位置的参数值
在前面的例子中,没有使用`shift`命令的参数,参数值被向左移了1。在这个例子中,我们可以看到`shift`命令的可选参数的使用。用下面的脚本创建一个bash文件,打印偶数位置的命令行参数值。命令行参数的总数已被计算并存储在变量total中, 它已被用于while 循环中的迭代循环。`shift`命令的参数值为2,用于在循环的每个迭代中转移两个命令行参数。每个偶数位置的命令行参数在执行脚本后都会被打印出来,并加上空格。
#!/bin/bash
#Count the total number of command-line arguments
total=$#
echo "Total arguments are: $total"
echo "The argument values of the even position are:"
while [ $total -ge0 ];
do
#Print the argument value with space
echo -n $1 " "
#Shift two arguments
shift 2
#Decrement the counter by 2
((total=$total-2))
done
#Add new line
echo
输出
根据下面的输出结果,上面的脚本执行了六个命令行参数值,而没有执行脚本名称。在打印出数值89之后,下一个偶数位置的数值是34,而下一个偶数位置的数值是12。

例3:读取特定参数的特定值
使用`shift`命令读取特定的命令行参数值而不使用任何循环的方法已在本例中显示。用下面的脚本创建一个bash文件。在脚本中计算了命令行参数的总数,如果总数少于6,脚本将以显示错误信息的方式终止。如果六个命令行参数被正确给出,第二个参数将包含主机名,第四个参数将包含用户名,第六个参数将包含密码。主机名将通过左移一个参数而被储存在一个变量中。用户名将通过两个参数的左移被存储在一个变量中。密码将被储存在一个变量中,再向左移动两个参数。接下来,主机名、用户名和密码值将与三个字符串值进行比较,以验证用户的身份。
#!/bin/bash
#Count the total number of command-line arguments
total=$#
#Check the 6 argument values are given or not
if [ $total -lt6 ]; then
echo "Invalid number of arguments."
else
#Shift one argument
shift 1
#Read the value of hostname
hostname=$1
#Shift two arguments
shift 2
#Read the value of username
username=$1
#Shift two arguments
shift 2
#Read the value of password
password=$1
fi
输出
根据输出结果,上述脚本被执行了两次,有六个参数值。在第一次执行中,有效的数据被传递,并且打印了一条成功信息。在第二次执行中,传递了无效的数据,并打印了一条失败信息。

总结
shift "命令是一个非常有用的命令,用于读取特定的命令行参数值。本教程通过多个例子描述了该命令的不同用途,以帮助读者理解在bash脚本中使用该命令的目的。