给定 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
re='[ \t]*(([^ \t"]+|"[^"]*")+)'
s=$foo
foo_transformed=()
while [[ $s =~ $re ]]; do
foo_transformed+=("${BASH_REMATCH[1]}")
s=${s#"${BASH_REMATCH[0]}"}
done