例如,在下面的代码片段中,(如何)可以在仍然使用变量的同时进行array2
相同的操作?array1
str
~$ { str='a "b c" d'; array1=(a "b c" d); array2=( $str )
echo "${array1[1]} ${array1[2]}"
echo "${array2[1]} ${array2[2]}"; }
b c d
"b c"
答案1
Running str='a "b c" d'
,引号按字面意思获取,之后没有特殊含义,它们只是一个与其他字符一样的字符,不会阻止分词不再了。
当使用引号分配数组时,会在分配之前从 shell 中计算引号,以防止分词:
array1=(a "b c" d);
顺便说一句:使用比设置数组并使用元素printf
循环更容易展示问题:echo
printf '%s\n' $str
您可以使用eval
作为解决方法,但是我不建议这样做对于您无法 100% 控制或信任的任何输入(用户输入、网页抓取内容等):
eval "printf '%s\n' $str"
#or
eval "array2=( $str )"
无论如何,从您的示例来看,我认为没有理由使用中间变量,只需直接使用数组即可。
答案2
是的,通过使用eval
.
感谢大家确认报价问题的类型。
只需使用eval "array2=( $str )"
而不是array2=( $str )
.
但请注意,使用eval
通常是一个坏主意。