kami ingin membuat 6 folder mount point sebagai contoh
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
jadi kami menulis skrip bash sederhana ini menggunakan array
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
sekarang kita ingin mengubah kode tanpa penghitung dan biarkan = $ counter = penghitung + 1
apakah mungkin untuk menggeser setiap loop array untuk mendapatkan nilai array selanjutnya?
seperti sesuatu
${folderArray[++]}
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
karena tidak digunakan dalam loop body?for i in "your_list_goes_here"; do mkdir /data/"$i"; done
?Jawaban:
Komentar umum. Tidak masuk akal untuk mendefinisikan array seperti ini:
Anda akan melakukan ini sebagai gantinya:
Sekarang untuk pertanyaan Anda:
atau
sumber
set -- $list_of_folders
tetapi sekali lagi: Variabel string bukan cara untuk pergi:set -- "${folders[@]}"
set -- ....
? hack itu hanya diperlukan di shell yang tidak mendukung array - tidak perlu di shell yang mendukung array.for folder_name in "${folderArray[@]}"; do ... ; done
hanya itu yang dibutuhkan.set
pendekatan ini .Untuk menjawab pertanyaan dalam judul, Anda dapat "menggeser" array dengan notasi substring / subarray. (
shift
itu sendiri bekerja hanya dengan parameter posisi.)Demikian pula, untuk 'pop' item terakhir dari array:
a=("${a[@]:0:${#a[@]} - 1}" )
atauunset "a[${#a[@]}-1]"
Jadi jika Anda mau, Anda bisa melakukan ini:
Tapi itu akan merusak array, jadi hanya mengindeks seperti biasa mungkin lebih baik. Atau mungkin menggunakan array asosiatif sebagai gantinya:
sumber
Anda dapat dengan mudah mengulang semua nilai, tidak perlu bergeser:
sumber
Anda tidak memerlukan loop apa pun untuk itu:
Kuncinya adalah bahwa jika sebuah array dikutip dua kali dengan subskrip
*
("${array[*]}"
) ia meluas ke satu kata dengan nilai setiap elemen array dipisahkan oleh karakter pertama dariIFS
variabel. Setelah itu kami menggunakan mekanisme ekspansi brace untuk melampirkan/data/
ke setiap anggota array daneval
uate semuanya.sumber
cd /data ; mkdir "${folderArray[@]}"
Saya telah melakukan hal yang sama sebelumnya tetapi saya tidak akan dalam kasus seperti ini. Tapi +1 untuk pendekatan lanjutan.mkdir
perintah. Dan bahkan array tidak diperlukan,cd /data; mkdir abc def
seperti yang dilakukan orang normal. Tetapi tidak bisa sesederhana untuk tugas-tugas lain, jadi ada baiknya untuk mengetahui cara melampirkan string dengan cepat ke setiap elemen array tanpa loop.echo "${folderArray[((counter++))]}"
jika Anda benar-benar menyukai pendekatan ini. Hal-hal di dalam(())
dievaluasi sebagai matematika (perhatikan kurangnya$
di depancounter
).