为 shell 脚本中的选项提供参数列表的方法?
Ways to provide list of parameters to options in shell scripts?
基本上我正在制作一个脚本,我想在其中为某个选项提供参数列表,比如 -l
,例如:
usr@domain:$./somescript -l hi bye cry nigh
然后将指定给 -l
的列表存储到特定数组中并迭代。
到目前为止,我一直在使用 Arch linux 的 mkinitcpio 脚本中的这些行来执行此操作。这允许为一个选项指定一个逗号分隔的列表:
_optaddhooks()
while :; do
case in
-A|--add|--addhooks)
shift
IFS=, read -r -a add <<< ""
_optaddhooks+=("${add[@]}")
unset add
;;
还有哪些其他方法可以做到这一点,尤其是在使用其他 options/parameters 时?提供给选项的列表可以 space 分隔吗?还是用“,”(或其他字符)指定列表更容易管理?
更新:OP正在寻找非getopts
解决方案;在当前代码中添加 -l
选项:
注意:OP 已将命令行标志显示为 -l
所以不确定 -A|-add|--addhooks)
与什么有关... ???
unset _optaddhooks
while :; do
case "" in
-A|--add|--addhooks)
shift
....
;;
-a) shift
vara=""
;;
-l) shift
_optaddhooks=( )
;;
-z) shift
varz=""
;;
....
esac
done
OP 仍将使用与先前答案(如下)相同的命令行:
$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456
如果您愿意将 -l
args 括在引号中,您可以将 args 作为单个参数传递,然后让 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
部分)应该很容易。
基本上我正在制作一个脚本,我想在其中为某个选项提供参数列表,比如 -l
,例如:
usr@domain:$./somescript -l hi bye cry nigh
然后将指定给 -l
的列表存储到特定数组中并迭代。
到目前为止,我一直在使用 Arch linux 的 mkinitcpio 脚本中的这些行来执行此操作。这允许为一个选项指定一个逗号分隔的列表:
_optaddhooks()
while :; do
case in
-A|--add|--addhooks)
shift
IFS=, read -r -a add <<< ""
_optaddhooks+=("${add[@]}")
unset add
;;
还有哪些其他方法可以做到这一点,尤其是在使用其他 options/parameters 时?提供给选项的列表可以 space 分隔吗?还是用“,”(或其他字符)指定列表更容易管理?
更新:OP正在寻找非getopts
解决方案;在当前代码中添加 -l
选项:
注意:OP 已将命令行标志显示为 -l
所以不确定 -A|-add|--addhooks)
与什么有关... ???
unset _optaddhooks
while :; do
case "" in
-A|--add|--addhooks)
shift
....
;;
-a) shift
vara=""
;;
-l) shift
_optaddhooks=( )
;;
-z) shift
varz=""
;;
....
esac
done
OP 仍将使用与先前答案(如下)相同的命令行:
$ ./somescript -a this_is_a -l 'hi bye cry nigh' -z 123456
如果您愿意将 -l
args 括在引号中,您可以将 args 作为单个参数传递,然后让 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
部分)应该很容易。