shift 命令是包含在Bash内的一个Bourne shell内建命令。这个命令需要一个参数,一个数字,This command takes one argument, a number. The positional parameters are
shifted to the left by this number, N. The positional parameters from N+1
to $#
are renamed to variable names from $1
to $# - N+1
.
Say you have a command that takes 10 arguments, and N is 4, then $4
becomes $1
, $5
becomes $2
and so on. $10
becomes $7
and the original $1
, $2
and $3
are thrown away.
If N is zero or greater than $#
(the total number of arguments, see 第 7.2.1.2 节 “检查命令行参数”). If N is not present, it is assumed to be 1. The return status is zero unless N is greater than $#
or less than zero; otherwise it is non-zero.
shift语句通常在事先不知道参数个数的情况下使用,比如用户可以随他们喜欢给出任意数量的参数。这种情况下,参数通常在一个 while 循环中用 (( $# )) 测试条件来处理。只要参数的数量大于零那么条件测试就为真。 $1
变量和 shift 语句处理每个参数。The number of arguments is reduced each time shift is executed and eventually becomes zero, upon which the while loop exits.
下面的例子,cleanup.sh
, 使用 shift 语句来处理每个由 find 生成的列表中的文件:
#!/bin/bash # This script can clean up files that were last accessed over 365 days ago. USAGE="Usage: $0 dir1 dir2 dir3 ... dirN" if [ "$#" == "0" ]; then echo "$USAGE" exit 1 fi while (( "$#" )); do if [[ "$(ls $1)" == "" ]]; then echo "Empty directory, nothing to be done." else find $1 -type f -a -atime +365 -exec rm -i {} \; fi shift done
![]() |
-exec vs. xargs |
---|---|
以上 find 可以使用以下来替代:
xargs 命令从标准输入来建立执行命令行。在命令行到达系统限制的时候是有利的。只有这样才调用命令的执行,上面的例子中,将是 rm。如果没有更多的参数,一个新的命令行将被使用,直到这个until that one is full 或者没有更多的参数。同样的事情,使用 find |
下面的例子中,我们修改了 第 8.2.4.4 节 “Here 文档” 的脚本让它在一次安装的时候接受多个包:
#!/bin/bash if [ $# -lt 1 ]; then echo "Usage: $0 package(s)" exit 1 fi while (($#)); do yum install $1 << CONFIRM y CONFIRM shift done