是否可以重置 $@ 和 $# 以多次解析位置参数列表?

是否可以重置 $@ 和 $# 以多次解析位置参数列表?

我有一个通用脚本(common.sh)来解析一些参数。其他脚本使用 导入它source common.sh。有没有办法重置$@$#,以便我可以多次使用下面的代码进行参数解析?

我首先保存原始脚本参数,以便在参数解析运行后它们可用:

readonly script_args=("${@}")

但是,这只能节省争论;它无法shift 多次使用来运行参数解析。

参数解析:

while [[ $# -gt 0 ]]; do
    case "$1" in
    --command=*)
        command="${1#*=}"
        ;;
    --project=*)
        project="${1#*=}"
        ;;
    --workspace=*)
        workspace="${1#*=}"
        ;;
    --account=*)
        account="${1#*=}"
        ;;
    --debug)
        debug="true"
        ;;
    "")
        log_debug "Empty argument"
        ;;
    *)
        log_error "Invalid argument: ${1}"
        exit 1
        ;;
    esac
    shift
done

答案1

在类似 Bourne 的 shell 中,除了设置 shell 选项外,set还可以用于设置位置参数。

set -- "${script_args[@]}"

--需要:

  1. 标记选项的结尾,以便如果第一个元素以or$script_args开头,则不会将其视为选项。-+
  2. 为了解决这个问题,当没有参数传递给 时set,它会打印变量列表(以及某些 shell 中的函数),而不是将位置参数设置为空列表。

"${script_args[@]}", 哪个必须被引用的是 Korn shell 语法,它扩展了"$@"Bourne shell 的扩展以扩展到数组中的所有元素。zsh,bash和也支持该语法yash

在所有这些中yash,您还可以使用

set - "${script_args[@]}"

在 zsh 中,您还可以使用:

argv=( "$script_args[@]" )

在 中yash,您还可以使用:

set -- "$script_args"

等价物rc或衍生品将是:

* = $script_args

fish

set argv $script_args

csh/ tcsh(70 年代末第一个支持数组的 shell)

set argv = ($script_args:q)

¹ Bourne shell--直到 1981 年的 SysIII 才支持该功能,但始终支持-.它并不是真正的选项分隔符,只是选项仅考虑第一个参数(例如 for sh),并且这-是一个空选项列表。

相关内容