空格上的分词 bash 参数尊重并保留引号

问题描述 投票:0回答:1

给定 bash 参数

foo='ab   "cd" "e f"  x="1 2" '

我希望生成一个相当于

的数组
foo_transformed=( ab '"cd"' '"e f"' 'x="1 2"' )

以可移植的方式,意味着默认使用 bash (v3+) 内置程序或大多数操作系统(Linux、Unix、Cygwin)可用的程序。给定(几乎)任意输入字符串,简单性和安全性是可取的。

您可能假设输入不包含单引号

'
或反斜杠
\
,但可能包含任意数量的空白字符,无论是我希望它们分隔字符串的地方还是不包含的地方(当在双引号内时) .

如果我们尝试:

foo_transformed=( $foo )

然后

foo
的内部引号不受尊重 (
for k in "${foo_transformed[@]}"; do echo "- $k"; done
):

- ab
- "cd"
- "e
- f"
- x="1
- 2"

如果我们尝试:

eval foo_transformed=( $foo )

然后引号就丢失了:

- ab
- cd
- e f
- x=1 2
bash split
1个回答
0
投票
re='[ \t]*(([^ \t"]+|"[^"]*")+)'
s=$foo
foo_transformed=()

while [[ $s =~ $re ]]; do
    foo_transformed+=("${BASH_REMATCH[1]}")
    s=${s#"${BASH_REMATCH[0]}"}
done
© www.soinside.com 2019 - 2024. All rights reserved.