如何在bash中用引号(如命令参数)分割字符串?

fox*_*eSs 15 linux bash string-manipulation string

我有一个这样的字符串:

"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样拆分它:

aString that may haveSpaces IN IT
bar
foo
bamboo  
bam boo
Run Code Online (Sandbox Code Playgroud)

我怎么做?(最好使用单线)

Sho*_*sne 8

最简单的解决方案是使用带引号的 args 的数组,如果您愿意,可以循环遍历或直接传递给命令。

eval "array=($string)"

for arg in "${array[@]}"; do echo "$arg"; done   
Run Code Online (Sandbox Code Playgroud)

ps 如果您找到更简单的方法,请发表评论eval

编辑:

以@Hubbitus 的回答为基础,我们有一个经过全面消毒和正确引用的版本。注意:这有点矫枉过正,实际上会在大多数标点符号之前的双引号或单引号部分中留下额外的反斜杠,但不会受到攻击。

declare -a "array=($( echo "$string" | sed 's/[][`~!@#$%^&*():;<>.,?/\|{}=+-]/\\&/g' ))"
Run Code Online (Sandbox Code Playgroud)

我把它留给感兴趣的读者修改,因为他们认为合适http://ideone.com/FUTHhj


AFH*_*AFH 5

当我看到 David Postill 的回答时,我想“一定有一个更简单的解决方案”。经过一些实验,我发现了以下作品:-

string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"'
echo $string
eval 'for word in '$string'; do echo $word; done'
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为在执行结果行(这是内嵌答案)之前eval扩展行(删除引号和扩展string):

for word in "aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"; do echo $word; done
Run Code Online (Sandbox Code Playgroud)

扩展到同一行的替代方法是:

eval "for word in $string; do echo \$word; done"
Run Code Online (Sandbox Code Playgroud)

这里string是在双引号内展开的,但$必须对 进行转义,以便word在执行该行之前不展开(在另一种形式中,使用单引号具有相同的效果)。结果是:-

[~/]$ string='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"'
[~/]$ echo $string
"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"
[~/]$ eval 'for word in '$string'; do echo $word; done'
aString that may haveSpaces IN IT
bar
foo
bamboo
bam boo
[~/]$ eval "for word in $string; do echo \$word; done"
aString that may haveSpaces IN IT
bar
foo
bamboo
bam boo
Run Code Online (Sandbox Code Playgroud)


小智 5

看起来 xargs 可以做得很好:

$ a='"aString that may haveSpaces IN IT" bar foo "bamboo" "bam boo"'
$ printf "%s" "$a" | xargs -n 1 printf "%s\n"
aString that may haveSpaces IN IT
bar
foo
bamboo
bam boo
Run Code Online (Sandbox Code Playgroud)