15

関連していますが、重複していません: How to define hash tables in Bash?

bash ハッシュを定義して使用できますが、-x フラグを使用してもエクスポートできません。たとえば、次の例では、通常の文字列変数をエクスポート (およびエクスポートのテスト) します。

aschirma@graphics9-lnx:/$ export animal_cow="moo"
aschirma@graphics9-lnx:/$ bash -c "echo \$animal_cow"
moo
aschirma@graphics9-lnx:/$ 

ただし、ハッシュをエクスポートしようとすると:

aschirma@graphics9-lnx:/$ declare -A -x animals
aschirma@graphics9-lnx:/$ animals[duck]="quack"
aschirma@graphics9-lnx:/$ echo ${animals[duck]}
quack
aschirma@graphics9-lnx:/$ bash -c "echo \${animals[duck]}"

aschirma@graphics9-lnx:/$ 

ネストされた bash シェルのスコープにハッシュがないようです。ネストされた bash シェルに手動で入力し、ハッシュを対話的に使用することによっても、これを確認しました。

4

3 に答える 3

7

配列変数を環境にエンコードする良い方法は実際にはありません。http://www.mail-archive.com/bug-bash@gnu.org/msg01774.htmlを参照して ください(Chet Ramey は bash のメンテナーです) 。

于 2012-10-17T23:09:53.080 に答える
0

これは少し古いですが、とにかく答えます。一時ファイルを使用できます。正しく行うと、ラッパーを使用して配列のように使用できます。たとえば、次の関数を使用します。

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"

これは最速の方法ではありませんが、非常に柔軟でシンプルで、ほぼすべてのシェルで機能します。

于 2013-06-18T20:06:09.953 に答える