如何过滤bash数组

如何过滤bash数组,bash,Bash,假设我有一个bash数组 X=("a" "b c" "-d" "k j", "-f") 我想通过是否以“-”开头进行筛选,并获取 (“a”“b”“c”“k j”)和(“-d”“-f”) 我如何才能做到这一点?我认为您必须遍历数组: $ X=("a" "b c" "-d" "k j", "-f") $ for elem in "${X[@]}"; do [[ $elem == -* ]] &

假设我有一个bash数组

X=("a" "b c" "-d" "k j", "-f")
我想通过是否以
“-”
开头进行筛选,并获取
(“a”“b”“c”“k j”)
(“-d”“-f”)


我如何才能做到这一点?

我认为您必须遍历数组:

$ 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,
从中,您可以执行以下操作:

A=$((IFS=$'\n' && echo "${X[*]}") | grep '^-')
B=$((IFS=$'\n' && echo "${X[*]}") | grep -v '^-')
根据这一回答:

这里的要点是IFS=$'\n'导致“${MY_ARR[*]}”用分隔项目的换行符展开,因此它可以通过grep进行管道传输。 特别是,这将处理嵌入数组项中的空间

然后,我们使用
grep
/
grep-v
过滤与模式匹配的输入/输出元素来解析参数。