Linux

如何在bash中移動數組值

  • May 9, 2021

我們要建構 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

現在我們要更改沒有計數器的程式碼並讓=$counter=counter+1

是否可以移動每個循環數組以獲得下一個數組值?

就像

${folderArray[++]}

一般性評論。像這樣定義一個數組是沒有意義的:

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

要回答標題中的問題,您可以使用子字元串/子數組表示法“移位”一個數組。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

引用自:https://unix.stackexchange.com/questions/413976