如何过滤Bash数组

8
假设我有一个 bash 数组
X=("a" "b c" "-d" "k j", "-f")

我希望按照是否以"-"开头进行过滤,并分别获取("a" "b c" "k j")("-d" "-f")。请问我该如何实现?

使用 getopts 来解析参数。 - Amadan
2个回答

11

我认为你需要遍历这个数组:

$ X=("a" "b c" "-d" "k j", "-f")
$ for elem in "${X[@]}"; do [[ $elem == -* ]] && with+=("$elem") || without+=("$elem"); done
$ printf "%s\n" "${with[@]}"
-d
-f
$ printf "%s\n" "${without[@]}"
a
b c
k j,

5

从一个类似问题的答案中,您可以这样做:

A=$((IFS=$'\n' && echo "${X[*]}") | grep '^-')
B=$((IFS=$'\n' && echo "${X[*]}") | grep -v '^-')

根据这个答案:

IFS=$'\n' 的作用是将 "${MY_ARR[*]}" 扩展为以换行符分隔的项,以使它可以通过 grep 进行管道处理。 特别地,这将处理嵌入在数组项中的空格。

然后我们使用 grep / grep -v 来过滤匹配模式的元素 / 排除匹配模式的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接