在脚本中使用shift语句

在脚本中使用shift语句

我正在浏览一个 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,这将检查每个命令是否失败。

相关内容