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-
所以整个字符串都在数组的第一个元素中:/
答案 0 :(得分:3)
使用eval
扩展变量,然后使用()
将所有内容解析为数组:
eval array=($options)
echo ${array[0]}
给出
Package A
请注意
array=($options)
还会创建一个数组但有一个包含6个元素的数组:"Package
,A"
,...
编辑这是如何运作的?
在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
中的元素!!!