基本上,我正在制作一个脚本,其中我想为一些选项提供一个参数列表,比如-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
部分(应该足够容易。