如何在bash中移动数组值

如何在bash中移动数组值

作为示例,我们要构建 6 个挂载点文件夹

/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg

所以我们使用数组编写了这个简单的 bash 脚本

folder_mount_point_list="sdb sdc sdd sde sdf sdg"

folderArray=( $folder_mount_point_list )

counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done

现在我们想改变代码而不柜台让=$计数器=计数器+1

是否可以移动数组的每个循环以获得下一个数组值?

就像

${folderArray[++]}

答案1

要回答标题中的问题,您可以使用子字符串/子数组表示法“移动”数组。shift其本身仅适用于位置参数。

$ a=(a b c d e)
$ a=("${a[@]:1}")
$ echo "${a[@]}"
b c d e

类似地,要从数组中“弹出”最后一项:a=("${a[@]:0:${#a[@]} - 1}" )unset "a[${#a[@]}-1]"

所以如果你愿意,你可以这样做:

a=(foo bar doo)
b=(123 456 789)
while [ "${#a[@]}" -gt 0 ]; do
    echo "$a $b"
    a=("${a[@]:1}")
    b=("${b[@]:1}")
done

但它会破坏数组,并且“移动”分配可能会不必要地复制数据,所以像往常一样建立索引可能会更好

a=(foo bar doo)
b=(123 456 789)
i=0
while [ "$i" -lt "${#a[@]}" ]; do
    echo "${a[i]} ${b[i]}"
    i=$((i+1))
done

或者,如果您不关心项目的顺序,则可以改用关联数组。"${!arr[@]}"以未指定的顺序给出密钥,可能不是他们被分配的顺序:

declare -A arr=([foo]=123 [bar]=456 [doo]=789)
for k in "${!arr[@]}"; do
    echo "$k ${arr[$k]}"
done

答案2

一般性评论。像这样定义一个数组是没有意义的:

folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )

你可以这样做:

folderArray=(sdb sdc sdd sde sdf sdg)

现在回答你的问题:

set -- sdb sdc sdd sde sdf sdg
for folder_name; do
    mkdir "/data/$folder_name"
done

或者

set -- sdb sdc sdd sde sdf sdg
while [ $# -gt 0 ]; do
    mkdir "/data/$1"
    shift
done

答案3

您可以简单地循环所有值,无需移位:

folderArray=(sdb sdc sdd sde sdf sdg)

for folder in "${folderArray[@]}"; do
    mkdir "/data/$folder"
done

答案4

您要问的问题是如何使用++来递增数组索引。

像这样:

folderArray=( sdb sdc sdd sde sdf sdg  )

counter=0

for i in disk1 disk2 disk3 disk4 disk5 disk6; do
    folder_name=${folderArray[counter++]}
    echo mkdir /data/$folder_name
done

数组的索引( 里面的内容[])处于算术环境中,因此后增量 ( ++) 可以工作。


标题上的问题使用术语shift。像位置参数一样的移动可以通过重建数组来完成(一个缓慢的过程)。

folderArray=( sdb sdc sdd sde sdf sdg  )

shiftArray=( "${folderArray[@]}" )

counter=0
for i in disk1 disk2 disk3 disk4 disk5 disk6; do
    echo mkdir /data/$shiftArray

    shiftArray=( "${shiftArray[@]:1}" )

done

但直接使用数组索引似乎更简单:

folderArray=( sdb sdc sdd sde sdf sdg  )

for((i=0;i<${#folderArray[@]};)); do
    echo mkdir /data/"${folderArray[i++]}"
done

相关内容