Bash中标量与单元素数组的区别:二者是否可等效处理?
标量与单元素数组是否等效?
问题:除了declare -p的输出差异外,Bash中的标量和单元素数组是否无法区分?将二者视为完全等效是否安全?
先定义两个测试变量:
X="cat" # 标量 Y=("cat") # 单元素数组
在常规使用场景中,二者表现高度相似:
- 将数组当作标量使用时,会默认取数组的第一个元素
- 将标量当作数组使用时,行为类似仅包含自身值的单元素数组
用declare -p可明确区分二者
declare -p命令能直接显示变量的类型信息,清晰区分标量和数组:
declare -p X Y # 输出结果: # declare -- X="cat" # declare -a Y=([0]="cat")
数组当作标量使用的表现
此时二者行为完全一致:
echo string length: ${#X} ${#Y} # 输出:string length: 3 3 echo values: $X $Y # 输出:values: cat cat [ "$X" == "$Y" ] && echo "equality test is true" # 输出:equality test is true
标量当作数组使用的表现
此时标量的行为与单元素数组几乎一致:
echo "array length: ${#X[@]} ${#Y[@]}" # 输出:array length: 1 1 echo "array indexing: ${X[0]} ${Y[0]}" # 输出:array indexing: cat cat echo \"${X[1]}\" \"${Y[1]}\" # 输出:"" ""
注意:二者并非始终等效
尽管多数场景下表现一致,但正如M. Nejat Aydin和Ed Morton指出的,标量与单元素数组并非在所有场景下都等效,因此不能完全将二者视为安全等效。
内容的提问来源于stack exchange,提问作者kevin_o
相关产品推荐
相关产品推荐

