Bash 从数组中提取值

Bash 从数组中提取值,bash,shell,Bash,Shell,我有一系列选项及其参数: ARGS=('-a'-c''红色''橙色''--详细'-p''苹果''香蕉') 我需要提取选项-c的参数,并获取其余参数的列表: echo“${COLORS[@]}”返回:红橙色 echo“${OPTIONS[@]}”返回:-a--verbose-p苹果香蕉 我已经使用getopts获得了一个颜色列表(可能不是最好的方法),但我没有找到提取其余选项的方法 COLORS=() 设置颜色(){ 而getopts“p:”选项2>/dev/null;do 中的案例${opt

我有一系列选项及其参数:

ARGS=('-a'-c''红色''橙色''--详细'-p''苹果''香蕉')
我需要提取选项
-c
的参数,并获取其余参数的列表:

echo“${COLORS[@]}”返回:红橙色
echo“${OPTIONS[@]}”返回:-a--verbose-p苹果香蕉
我已经使用
getopts
获得了一个颜色列表(可能不是最好的方法),但我没有找到提取其余选项的方法

COLORS=()
设置颜色(){
而getopts“p:”选项2>/dev/null;do
中的案例${option}
(p)
颜色+=(“$OPTARG”)
而[[“$OPTIND”-le“$#”]&&[“${!OPTIND:0:1}”!=”-“]];则
颜色+=(“${!OPTIND}”)
((OPTIND++)
完成
;;
*) ;;
以撒
完成
}
设置颜色“${ARGS[@]}”

我在浏览选项并将其分配到两个数组时,使用变量
$in_colors
作为标志

#! /bin/bash
ARGS=('-a' '-c' 'red' 'orange' '--verbose' '-p' 'apple' 'banana')

in_colors=0
for arg in "${ARGS[@]}" ; do

    if [[ $arg == '-c' ]] ; then
        in_colors=1
    elif [[ $arg == -* ]] ; then
        in_colors=0
    fi

    if ((in_colors)) ; then
        colors+=("$arg")
    else
        opts+=("$arg")
    fi
    shift
done
echo "Colors: ${colors[@]}"
echo "Options: ${opts[@]}"

为了与其他工具兼容,我建议让您的工具接受命令行选项为
-a-c red-c orange--verbose-p apply-p banana
-ie.
-c
标志是累积的,需要为每种颜色指定。这将使解析参数变得更容易,也更一致,但带来了一些不便;在您自己的软件中使用至少带有一个小写字符的名称,以避免无意中修改标准定义工具的行为。(请阅读链接规范,记住shell变量和环境变量共享一个名称空间——修改前者会在名称匹配时隐式更改后者)…顺便说一句,我非常同意上面@KamilCuk的建议。这是一个广泛使用的惯例,有充分的理由。谢谢你的建议。我会跟着他们