bash - 向 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
;;
还有哪些其他方法可以做到这一点,尤其是在使用其他选项/参数时?提供给选项的列表可以用空格分隔吗?或者通过“,”(或其他字符“)指定列表更容易管理?
解决方案
更新: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
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"
虽然这是一个简单的示例,但根据需要修改代码(语句l
的部分)应该很容易。case
推荐阅读
- git - 是否可以将存储库从 TFS2015 直接升级到 Azure devops git?
- groovy - 将外部文件用于 groovy 脚本时,JMeter 变慢
- c# - 为什么我的 DashboardView 不显示?
- xaml - 自定义单选按钮 UWP
- angular - 如何通过某些语句(例如通过输入值)投影组件的内容
- vhdl - VHDL:即使在架构声明部分定义了内部信号也是未定义的
- spring - Spring,当我运行我的项目时,它被重定向到登录页面
- python - 如何使用 seaborn relplot 从多个数据帧中绘制数据
- amazon-web-services - 如果云形成条件
- c++ - 有没有办法这个 lambda 可以捕获指针的副本?