![如何在bash中移动数组值](https://linux22.com/image/124713/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E4%B8%AD%E7%A7%BB%E5%8A%A8%E6%95%B0%E7%BB%84%E5%80%BC.png)
作为示例,我们要构建 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