2012-10-17 23 views
5

İlgili fakat değil yinelenen: How to define hash tables in Bash?Bash'ta bir ilişkisel dizi (karma) nasıl dışa aktarılır?

ben tanımlayabilir ve bash karma kullanın, ancak ben bile -x bayrağıyla, dışa alamıyorum olabilir. Örneğin, aşağıdaki işleri normal dize değişkeni (ve test ihracat içinde) ihracat:

[email protected]:/$ export animal_cow="moo" 
[email protected]:/$ bash -c "echo \$animal_cow" 
moo 
[email protected]:/$ 

Ancak, karma dışa denerseniz:

[email protected]:/$ declare -A -x animals 
[email protected]:/$ animals[duck]="quack" 
[email protected]:/$ echo ${animals[duck]} 
quack 
[email protected]:/$ bash -c "echo \${animals[duck]}" 

[email protected]:/$ 

iç içe bash kabuk yapar gibi görünüyor kendi alanında karma yok. Bunu ayrıca iç içe geçmiş bash kabuğuna elle girerek ve karma etkileşimli olarak kullanmayı denedim.

cevap

5

Bir dizi değişkenini çevreye kodlamak için gerçekten iyi bir yol yoktur. http://www.mail-archive.com/[email protected]/msg01774.html

+1

Biraz daha derine inerek, işletim sistemi tarafından ortam tanımlanır; kabuklar sadece çevreyi doldurmanın bir yolunu sağlar. POSIX (örnek olarak kullanmak), ortam değişkenleri için yapılandırılmış veriler için bir tanım sağlamaz; her değer basitçe bir dizedir. Bir diziyi (düzenli veya ilişkilendirici) tek bir dizeye dönüştürmek için bash'ın herhangi bir denemesi, bash'a özgü olacaktır. Bu, taşınabilirlik artık sadece işletim sistemi tarafından tanımlanmadığı için, ancak herhangi bir kullanıcının bir programı başlatmak için kullanmaya karar verebileceği herhangi bir yöntemle, bir taşınabilirlik kabusu yaratır. – chepner

0

Bu biraz eski ama geçici dosyaları kullanabilirsiniz, yine de cevap (Chet Ramey Bash muhafaza edicisidir) bakınız. Bunu doğru yaparsanız, bunları diziler gibi kullanmak için sarın. Bu işlevle Örneğin:

var() { # set var or add comtent 
    case $1 in 
    *=|*=*) 
     local __var_part1=$(echo "$1" | sed -e 's/=.*//' -e 's/[+,-]//') # cut +=/= 
     local __var_part2=$(echo "$1" | sed -e 's/.*.=//') 
     local __var12=$tmp_dir/$__var_part1 
     mkdir -p ${__var12%/*} #create all subdirs if its an array 
     case $1 in 
     *+=*) 
       # if its an array try to add new item 
      if [ -d $tmp_dir/$__var_part1 ] ; then 
      printf -- $__var_part2 > $tmp_dir/$__var_part1/\ $(( 
       $(echo $tmp_dir/$__var_part2/* \ 
        | tail | basename)\ + 1)) 
      else 
      printf -- "$__var_part2" >> $tmp_dir/$__var_part1 
      fi 
      ;; 
     *-=*) false ;; 
      # else just add content 
      *) printf -- "$__var_part2" > $tmp_dir/$__var_part1 ;; 
     esac 
     ;; 
    *) # just print var 
     if [ -d $tmp_dir/$1 ] ; then 
     ls $tmp_dir/$1 
     elif [ -e $tmp_dir/$1 ] ; then 
     cat $tmp_dir/$1 
     else 
     return 1 
     fi 
     ;; 
    esac  
} 

# you can use mostly like you set vars in bash/shell 
var test='Hello Welt!' 
# if you need arrays set it like this: 
var fruits/0='Apple' 
var fruits/1='Banana' 

# or if you need a dict: 
var contacts/1/name="Max" 
var contacts/1/surname="Musterman" 

Bu değil en hızlı şekilde, ama onun çok esnek, basit ve neredeyse tüm kabukları çalışır.

İlgili konular