我发现bash有点奇怪,我无法解释。当我使用带引号的字符串(单引号和双引号)的方括号表示法初始化数组时,该字符串将作为数组的第一个元素放置。当我将字符串放入变量中并且对该变量执行相同操作时,该字符串会被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
和上执行的a string
,而不是在加引号的版本"$test1"
和上执行的"a string"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句