Bash 数组不会将元素添加到最后

Bash 数组不会将元素添加到最后
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# array=()
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# for i in 1 2 3 4
> do
> array+=($i)
> done
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# echo $array
1
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# for i in 1 2 3 4; do array+=( $i ); done
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# echo $array
1
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# for i in 1 2 3 4; do array+=( $i ); done
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# for i in 1 2 3 4; do
> array=( "${array[@]}" "$i" )
> done
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# echo $array
1
root@kali-linux:~/Softwares/Softwares/Tools/dirsearch# 

如何在 bash 中向数组添加/删除元素?我尝试像这个问题中所说的那样添加,但它仍然不起作用并打印 1

答案1

您的循环很好(除了您忘记引用$i),问题出在您的 中echo $array,它没有打印 中数组的所有元素bash

bash复制了尴尬的数组设计,ksh而不是zsh, csh, tcsh, rc...

在 ksh 中,$array是 的缩写${array[0]}(扩展为索引 0 的元素的内容,如果未设置,则扩展为空字符串)。

要扩展到数组的所有元素,您需要:

$ printf ' - "%s"\n' "${array[@]}"
 - "1"
 - "2"
 - "3"
 - "4"

对于数组的第一个元素(可能不是索引为 0 的元素,因为 ksh/bash 数组是稀疏的):

$ printf '%s\n' "${array[@]:0:1}"
1

对于索引 0 的元素(在您的示例中,该元素与第一个元素相同):

$ printf '%s\n' "$array"
1

或者:

$ printf '%s\n' "${array[0]}"
1

要打印变量的定义,您还可以使用typeset -p

ksh93u+$ typeset -p array
typeset -a array=( 1 2 3 4 )
bash-5.0$ typeset -p array
declare -a array=([0]="1" [1]="2" [2]="3" [3]="4")
bash-5.0$ unset 'array[0]'
bash-5.0$ typeset -p array
declare -a array=([1]="2" [2]="3" [3]="4")
bash-5.0$ printf '%s\n' "$array"

bash-5.0$ printf '%s\n' "${array[@]:0:1}"
2

相关内容