如何为shell脚本中的选项提供参数列表



基本上,我正在制作一个脚本,其中我想为一些选项提供一个参数列表,比如-l,例如:

usr@domain:$./somescript -l hi bye cry nigh

指定给-l的列表将被存储到一个特定的数组中并进行迭代。

到目前为止,我一直在使用Arch-linux的mkinitcpio脚本中的这些行

_optaddhooks()
while :; do
case $1 in
-A|--add|--addhooks)
shift
IFS=, read -r -a add <<< "$1"
_optaddhooks+=("${add[@]}")
unset add
;;

还有什么其他方法可以做到这一点,特别是当将使用其他选项/参数时?提供给选项的列表可以用空格分隔吗?或者通过"(或其他一些字符"(更容易管理?

UPDATE:OP正在寻找一个非getopts解决方案;在当前代码中添加-l选项:

注意:OP已将命令行标志显示为-l,因此不确定-A|-add|--addhooks)与什么有关???

unset _optaddhooks
while :; do
case "${1}" in
-A|--add|--addhooks)
shift
....
;;
-a) shift
vara="${1}"
;;
-l) shift
_optaddhooks=( ${1} )
;;
-z) shift
varz="${1}"
;;
....
esac
done

OP仍将使用与前面回答(如下(中相同的命令行:

$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456   

如果您愿意将-l参数用引号括起来,那么您可以将这些参数作为单个参数传递,然后让bash根据您的意愿解析该参数。

-l参数加载到名为_optaddhooks[]:的数组中的一个想法

$ cat somescript
#!/usr/bin/bash
while getopts :a:l:z: opt
do
case ${opt} in
a)   vara="${OPTARG}"           ;;
l)   _optaddhooks=( ${OPTARG} ) ;;
z)   varz="${OPTARG}"           ;;
*)   echo "Sorry, don't understand the option '${opt}'" ;;
esac
done
typeset -p vara _optaddhooks varz

示例运行:

$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456
declare -- vara="this_is_a"
declare -a _optaddhooks=([0]="hi" [1]="bye" [2]="cry" [3]="nigh")
declare -- varz="123456"

虽然这是一个简单的示例,但根据需要修改代码(case语句的l部分(应该足够容易。

相关内容

  • 没有找到相关文章

最新更新