2012-10-17 25 views
5

Có liên quan, nhưng không trùng lặp với: How to define hash tables in Bash?Làm thế nào để xuất một mảng kết hợp (băm) trong bash?

Tôi có thể xác định và sử dụng băm băm, nhưng tôi không thể xuất nó, ngay cả với cờ -x. Ví dụ, các công trình sau đây để xuất khẩu (và kiểm tra xuất khẩu của) một biến chuỗi bình thường:

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

Tuy nhiên, nếu tôi cố gắng để xuất khẩu một hash:

[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]:/$ 

Dường như vỏ bash lồng nhau không không có hàm băm trong phạm vi của nó. Tôi đã xác minh điều này cũng bằng cách nhập thủ công vào vỏ bash lồng nhau và cố gắng sử dụng hàm băm tương tác.

Trả lời

5

Không có cách nào tốt để mã hóa biến mảng thành môi trường. Xem http://www.mail-archive.com/[email protected]/msg01774.html (Chet Ramey là người duy trì bash)

+1

Đi sâu hơn một chút, môi trường được xác định bởi hệ điều hành; vỏ chỉ cung cấp một cách để cư trú trong môi trường. POSIX (để sử dụng làm ví dụ) không cung cấp một định nghĩa cho dữ liệu có cấu trúc cho các biến môi trường của nó; mỗi giá trị chỉ đơn giản là một chuỗi. Bất kỳ nỗ lực nào bằng 'bash' để chuyển đổi một mảng (thông thường hoặc liên kết) thành một chuỗi đơn lẻ sẽ cụ thể cho' bash'. Điều đó tạo ra một cơn ác mộng về tính di động, vì môi trường không còn được định nghĩa đơn giản bởi hệ điều hành, mà bằng bất kỳ phương thức nào mà bất kỳ người dùng nào có thể quyết định sử dụng để khởi chạy một chương trình. – chepner

0

Đây là một chút cũ nhưng tôi vẫn trả lời, bạn có thể sử dụng các tệp tạm thời. Nếu bạn làm đúng, bạn có thể bao bọc nó để sử dụng chúng như mảng. Ví dụ với chức năng này:

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" 

Đây không phải là cách nhanh nhất, nhưng nó rất linh hoạt, đơn giản và hoạt động gần như tất cả các hệ vỏ.

Các vấn đề liên quan