bash中变量中字符串和字符串之间的差异

bash中变量中字符串和字符串之间的差异,bash,Bash,我在bash中发现了一些奇怪的东西,我无法解释。当我使用带引号的字符串(single和double)的括号表示法初始化数组时,该字符串将作为数组的第一个元素。当我将字符串放入变量中并对变量执行相同操作时,字符串被IFS正确分隔 #/bin/bash test1="hello my name is mr nobody" array1=($test1) test2='hello my name is mr nobody' array2=($test2) array3=("Hello my name

我在bash中发现了一些奇怪的东西,我无法解释。当我使用带引号的字符串(single和double)的括号表示法初始化数组时,该字符串将作为数组的第一个元素。当我将字符串放入变量中并对变量执行相同操作时,字符串被IFS正确分隔

#/bin/bash
test1="hello my name is mr nobody"
array1=($test1)
test2='hello my name is mr nobody'
array2=($test2)
array3=("Hello my name is mr nobody")
array4=('Hello my name is mr nobody')
declare -p array1
declare -p array2
declare -p array3
declare -p array4
输出:

declare -a array1='([0]="hello" [1]="my" [2]="name" [3]="is" [4]="mr" [5]="nobody")'
declare -a array2='([0]="hello" [1]="my" [2]="name" [3]="is" [4]="mr" [5]="nobody")'
declare -a array3='([0]="Hello my name is mr nobody")'
declare -a array4='([0]="Hello my name is mr nobody")'

究竟发生了什么,这两种方法有什么不同?

字符串和变量中的字符串没有区别。因此,以下两项是相同的:

> test1="hello my name is mr nobody"
> array1=($test1)

> array2=(hello my name is mr nobody)
以下两项也是如此:

> test2="hello my name is mr nobody"
> array3=("$test2")

> array4=("hello my name is mr nobody")
字符串不“记住”其部分或全部字符已被引用。引号完全是语法性的,由bash解释器解释(一次)

这与其他语言没有明显区别:在C或Python中,字符串“abc”有三个字符,而不是五个;引号仅用于指示文字是字符串。然而,在bash中,可以(有时)编写不带引号的字符串,这是许多其他语言所不允许的


分词是在不带引号的字符串上执行的,因此它是在
$test1
字符串上执行的,而不是在带引号的版本上执行的
“$test1”
“字符串”

您没有引用该字符串。使用
array1=(“$test1”)
谢谢。我觉得那些没有引号的字符串把我弄糊涂了。