当某些项目包含空格时,为什么无法将字符串变量转换为数组?

当某些项目包含空格时,为什么无法将字符串变量转换为数组?

例如,在下面的代码片段中,(如何)可以在仍然使用变量的同时进行array2相同的操作?array1str

~$ { 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通常是一个坏主意。

相关内容