SORU
29 EYLÜL 2009, Salı


Nasıl haşat hash tabloları tanımlamak için?

Ne bash Python dictionaries ama eşdeğerdir (OS X ve Linux üzerinde çalışması gerekir).

CEVAP
12 AĞUSTOS 2010, PERŞEMBE


Bash 4

Bash 4 doğal olarak bu özelliği destekler. Senaryo senindir hashbang #!/usr/bin/env bash #!/bin/bash veya Kaynaklar 10 ** 11 ** değil başka bir şey olduğundan emin olun. Komut çalıştırma olduğunuzdan emin olun, ve bir şey bash hashbang göz ardı edilmesine neden olan sh script gibi aptal değil. Bu basit şeyler, ama pek de başarısız devam et, bu yüzden yeniden yineleme.

Yaparak ilişkili bir dizi bildirmek için:

declare -A animals

Bu elemanlar normal dizi atama operatörünü kullanarak doldurabilirsiniz:

animals=( ["moo"]="cow" ["woof"]="dog")

Ya da onları birleştirmek için:

declare -A animals=( ["moo"]="cow" ["woof"]="dog")

O zaman normal diziler gibi onları kullanın. "${animals[@]}" değerleri, "${!animals[@]}" (! haber) anahtarları genişletir genişletir. Onları alıntı: sakın unutmayın

echo "${animals["moo"]}"
for sound in "${!animals[@]}"; do echo "$sound - ${animals["$sound"]}"; done

Bash 3

Önce bash 4, ilişkilendirilebilir diziler yok.eval onları taklit etmek için kullanmayın. Çünkü veba gibi eval kaçınmak gerekirveba kabuk komut dosyası. En önemli nedeni çalıştırılabilir kod (pek çok başka nedenler de var) elde edilen verileri işlemek istemiyorum.

Birincisi ve en önemlisiSadece bash 4 için yükseltme düşünün. Cidden.Gelecek şimdi başlıyordur yaşam geçmişte vebundan muzdaripkodunuzu ve her zavallı kırık ve çirkin aptal kesmek zorlayarak ruh bakımı sıkışmış.

Neden saçma bir bahane varsa "yükseltme", declare çok daha güvenli bir seçenektir. eval gibi bash kod gibi verileri değerlendirmek değil, ve gibi rastgele kod enjeksiyon bu kadar kolay izin vermez.

Hadi kavramları tanıtarak cevap hazırlayın:

İlk olarak, yönlendirme (cidden, hiç akıl hastası olduğu sürece bu kullanın veya kesmek yazmak için bazı diğer kötü bahanen var).

$ animals_moo=cow; sound=moo; i="animals_$sound"; echo "${!i}"
cow

İkinci olarak, declare:

$ sound=moo; animal=cow; declare "animals_$sound=$animal"; echo "$animals_moo"
cow

Onları bir araya getirmek:

# Set a value:
declare "array_$index=$value"

# Get a value:
arrayGet() { 
    local array=$1 index=$2
    local i="${array}_$index"
    printf '%s' "${!i}"
}

Hadi bunu kullanın:

$ sound=moo
$ animal=cow
$ declare "animals_$sound=$animal"
$ arrayGet animals "$sound"
cow

Not: bir işlev koyamazsınız declare. Bash bir işlev içinde declare birini kullanın yarattığı değişken döneryerelbu işlev kapsamı, anlamı ve global diziler erişim değiştiremez. (Beyan kullanabilirsiniz bash 4 global değişkenleri bildirmek için-g - 4, ilk etapta ilişkilendirilebilir diziler kullanarak, bu hack değil bash.)

Özet

Bash 4 için yükseltme ve declare -A kullanın. Değil, tamamen değiştirmeyi 32 ** yukarıda açıklandığı gibi çirkin kesmek yapmadan önce eğer. Ve kesinlikle durun halt eval hackery uzak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012
  • Trulia

    Trulia

    29 Kasım 2006