GNU/Linux >> Belajar Linux >  >> Linux

Array Asosiatif Dalam Skrip Shell?

Saya melihat trik untuk mengimplementasikan array asosiatif dalam skrip Shell. Misalnya print array["apples"] dapat ditulis sebagai echo $array$key di mana key=apel.

Namun, tidak disebutkan bagaimana cara menghasilkan kunci untuk mengulangi array.
Satu-satunya cara yang dapat saya pikirkan adalah menyimpan kunci dalam variabel yang dibatasi oleh spasi sehingga saya dapat menggunakan for-loop untuk beralih di atas larik.

Jadi, apakah ada cara lain untuk menyimpan kunci untuk digunakan nanti?

Jawaban yang Diterima:

Shell dengan array asosiatif

Beberapa shell modern menyediakan array asosiatif:ksh93, bash 4, zsh. Di ksh93 dan bash, jika a adalah larik asosiatif, maka "${!a[@]}" adalah larik kuncinya:

for k in "${!a[@]}"; do
  echo "$k -> ${a[$k]}"
done

Di zsh, sintaks itu hanya berfungsi dalam mode emulasi ksh. Jika tidak, Anda harus menggunakan sintaks asli zsh:

for k in "${(@k)a}"; do
  echo "$k -> $a[$k]"
done

${(k)a} juga berfungsi jika a tidak memiliki kunci kosong.

Di zsh, Anda juga bisa mengulang keduanya k mata dan v alues ​​pada saat yang sama:

for k v ("${(@kv)a}") echo "$k -> $v"

Shell tanpa array asosiatif

Meniru array asosiatif dalam shell yang tidak memilikinya membutuhkan lebih banyak pekerjaan. Jika Anda membutuhkan array asosiatif, mungkin sudah waktunya untuk membawa alat yang lebih besar, seperti ksh93 atau Perl.

Jika Anda memang membutuhkan array asosiatif dalam shell POSIX belaka, inilah cara untuk mensimulasikannya, ketika kunci dibatasi hanya berisi karakter 0-9A-Z_a-z (Digit ASCII, huruf dan garis bawah). Di bawah asumsi ini, kunci dapat digunakan sebagai bagian dari nama variabel. Fungsi di bawah ini bekerja pada larik yang diidentifikasi oleh awalan penamaan, "batang", yang tidak boleh berisi dua garis bawah berurutan.

## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
  eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
  eval "echo "$__aa__${1}""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
  eval "unset $3
        case $__aa__${1} in
          *" $2 "*) $3=$__aa__${1}__$2;;
        esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
  eval "__aa__${1}__${2}=$3
        case $__aa__${1} in
          *" $2 "*) :;;
          *) __aa__${1}="${__aa__${1}}$2 ";;
        esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
  eval "unset __aa__${1}__${2}
        case $__aa__${1} in
          *" $2 "*) __aa__${1}="${__aa__${1}%%* $2 } ${__aa__${1}#* $2 }";;
        esac"
}

(Peringatan, kode yang belum diuji. Deteksi kesalahan untuk batang dan kunci yang tidak valid secara sintaksis tidak disediakan.)

Terkait:Linux – media lambat – penyetelan cache disk?
Linux
  1. Parameter baris perintah dalam skrip shell

  2. Jalankan semua skrip shell di folder

  3. Menjalankan skrip dari direktori lain

  1. Penguncian yang Benar Dalam Skrip Shell?

  2. Bagaimana Cara Menjatuhkan Hak Istimewa Root Dalam Skrip Shell?

  3. Menyembunyikan Kata Sandi Dalam Skrip Shell?

  1. Berbagi Variabel di Beberapa Skrip Shell?

  2. Bagaimana Menguji Kepatuhan Posix Dari Skrip Shell?

  3. Memisahkan Perintah Panjang Dalam Skrip Shell?