将带有特殊字符的可变字符串存储到bash中的数组中

时间:2019-04-25 13:49:45

标签: bash shell

我需要将可能包含特殊字符(准确地说是*)的字符串作为单独的字符串存储到数组中。字符串是由函数返回的,因此在数组声明时我不知道其内容

foo(){
    in="my * string"
    echo "$in"
}
arr=($(foo))

我已经尝试过的是:

arr=("$(foo)")

其中*不会扩展,但是数组由1个字符串组成,并且:

arr=($(foo | sed -r "s/[\*]/'*'/g"))

用字符串*替换每次出现的*。这不是我想要实现的。我的目标只是将返回的字符串中的每个*存储为*

2 个答案:

答案 0 :(得分:2)

以这种方式存储数组不会扩展“ *”

features="classpath:com/com/karate/test/workflow/"

答案 1 :(得分:0)

简短回答:

 read -a arr <<< "$(foo)"

详细说明-

您的函数正确返回了单个字符串“ my * string”。 您对数组的赋值将在未加引号的上下文中执行该功能,因此将评估星号并将其解析为目录中所有内容的名称。

在外部括号内加上引号会使整个分配成为字符串“((我* *字符串)”)-也不是您想要的。您需要保留星号未扩展到目录内容但将字符串的元素解析为数组中单独项目的工具,对吗?

 read -a arr <<< "$(foo)"

这将传回正确引号的字符串,然后然后$IFS分割后将其读入数组,因此每个项目都将成为数组中未扩展的字符串。

$: echo "${#arr[@]}"
3
$: printf "%s\n" "${arr[@]}"
my
*
string