Bash数组切片后长度变为1?如何获取数组类型的切片结果
解决方案
你遇到的问题本质是Bash数组切片直接赋值给变量时默认返回拼接字符串,只要在切片表达式外层包裹数组声明的括号即可得到数组类型的结果。
正确写法示例
input=("first string" "second string" "third string") # 外层加()将切片结果声明为数组,加双引号保证带空格的元素不被拆分 slice=("${input[@]:1}")
结果验证
# 输出数组长度,结果为2符合预期 echo ${#slice[@]} # 输出第一个元素,结果为 second string echo "${slice[0]}" # 输出第二个元素,结果为 third string echo "${slice[1]}"
原写法问题说明
${input[@]:1}直接使用时,会将数组切片展开后的所有元素用IFS(内部字段分隔符)的第一个字符(默认是空格)拼接为单个普通字符串,所以你拿到的slice是字符串类型,长度自然为1。
只有外层加上(),Bash才会把展开后的每个独立元素作为新数组的元素存储,配合双引号使用可以避免元素内部的空格被识别为字段分隔符,导致元素被错误拆分。
可选替代方案
如果你不需要保留原数组,可以直接删除第一个元素实现效果:
unset input[0] # 此时input已经是去掉第一个元素的数组 echo ${#input[@]} # 输出2
内容的提问来源于stack exchange,提问作者therealmitchconnors
相关产品推荐
相关产品推荐

