我有一个通用脚本(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[@]}"
--
需要:
- 标记选项的结尾,以便如果第一个元素以or
$script_args
开头,则不会将其视为选项。-
+
- 为了解决这个问题,当没有参数传递给 时
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
),并且这-
是一个空选项列表。