在Bash中:如何解析" "分开的字符串

时间:2014-05-12 15:42:19

标签: arrays string bash parsing

echo "$options"打印:

“套餐A”“套餐B”“套餐C”

我想将该字符串放入数组中。我试过了:

IFS='" "' read -a array <<< "$options"

但是效果不好:现在字符串在每个“和每个[空格]之后分开。我想IFS的' '之间的所有内容都算作分隔符。 任何人都可以帮我解析我将拥有像

这样的数组的字符串
array[0]="Package A"
array[1]="Package B"
array[2]="Package C" 

array[0]=Package A
array[1]=Package B
array[2]=Package C 

感谢您的建议

[修改:实际状态] 这就是它现在的样子

#! /bin/bash

function parseoutput() {

    array="${1}"

for element in "${array[@]}"
do
    echo "$element"
    echo "-x-"
done

parseoutput "$options"


while $options="Package A" "Package B" "Package C" for循环的输出只有一次运行,即

"Package A" "Package B" "Package C"
-x-

所以整个字符串都在数组的第一个元素中:/

1 个答案:

答案 0 :(得分:3)

使用eval扩展变量,然后使用()将所有内容解析为数组:

eval array=($options)
echo ${array[0]}

给出

Package A

请注意

array=($options)

还会创建一个数组但有一个包含6个元素的数组:"PackageA",...

编辑这是如何运作的?

在BASH中,引号有助于将空格变为值的一部分。

a=(Package A)

会创建一个包含两个元素的数组。要获得单个元素,我们需要引用值:

a=("Package A")

现在$options已包含引号。但是在扩展变量时,BASH并没有对该行进行两次解析。所以在shell扩展后,它会看到

a=('"Package' 'A"')

(我使用单引号来说明BASH如何将输入分解为单词)。

这是一个小shell脚本,演示了使用变量$options的各种方法:

set -x
options='"A B" "C D"'
echo $options
echo "$options"

a=($options)
: ${#a[@]}
: ${a[@]}

eval a=($options)
: ${#a[@]}
: ${a[@]}

function a() {
    : "$@"
}

a "$options"
a $options
eval a $options

输出结果为:

+ options='"A B" "C D"'
+ : '"A' 'B"' '"C' 'D"'
+ : '"A B" "C D"'
+ a=($options)
+ : 4
+ : '"A' 'B"' '"C' 'D"'
+ eval 'a=("A' 'B"' '"C' 'D")'
++ a=("A B" "C D")
+ : 2
+ : A B C D
+ a '"A B" "C D"'
+ : '"A B" "C D"'
+ a '"A' 'B"' '"C' 'D"'
+ : '"A' 'B"' '"C' 'D"'
+ eval a '"A' 'B"' '"C' 'D"'
++ a 'A B' 'C D'
++ : 'A B' 'C D'

因此,要调用您的函数,您需要再次使用eval。之后,参数将在$1$2,...

eval parseoutput $options

要使其正常工作,必须正确引用$options中的元素!!!