我正在浏览一个 bash 脚本,想了解下面的内容,主要是语句shift
......它实际上在做什么?
while [ $# -gt 0 ]; do
case "$1" in
--mirror)
mirror="$2"
shift
;;
--dry-run)
DRY_RUN=1
;;
--*)
echo "Illegal option $1"
;;
esac
shift $(( $# > 0 ? 1 : 0 ))
done
答案1
脚本的参数以位置参数形式出现,$1
, $2
, ...shift
删除第一个参数,并将其余参数移至左侧。因此,如果参数是foo
, bar
, doo
, 则在转换后它们将是bar
, doo
。 shift 的参数表示移动了多少步,shift
没有参数与 相同shift 1
。
像这样的循环的通常形式是这样的:
while [ $# -gt 0 ]; do
# work with $1...
shift
done
只要有参数,循环就会继续,$#
包含它们的数量。循环的每次迭代都会查看第一个参数,最后的移位将其删除并移至下一个参数。
在您的代码中,最后的移位需要一个条件参数,$(( $# > 0 ? 1 : 0 ))
只要大于 0,即是否还有剩余参数1
;$#
如果0
没有的话。通常,这会解析为1
,因为我们只是在进入循环之前检查了同样的事情。
但是,如果脚本--mirror
作为最后一个参数,则 for 分支中的移位--mirror
会将其删除,并且不会剩下任何参数。随后的操作shift 1
将失败返回。这里的条件避免了这种情况。错误并不重要,除非脚本使用 运行set -e
,这将检查每个命令是否失败。