Linux
如何在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
現在我們要更改沒有計數器的程式碼並讓=$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