2016-12-02 80 views
1
process_ls_entry() { 
    IFS=' ' read -r -a array <<< "$1" 
    declare -A LS_MAP 
    LS_MAP[entry]="${array[@]::1}" 
    LS_MAP[mode]="${array[@]:1:1}" 
    LS_MAP[size]="${array[@]:2:1}" 
    LS_MAP[num_blocks]="${array[@]:3:1}" 
    timestamp="${array[@]:4}" 
    timestamp=${timestamp// /_} 
    LS_MAP[timestamp]="${timestamp}" 
    # how to return? 
} 

a="temp_dir drwxr-xr-x 0 0 Fri Jul 13 07:08:00 2012" 
output=($(process_ls_entry "$a")) 

# entry -> temp_dir 
# mode -> drwxr-xr-x 
# size -> 0 
# size -> 0 
# timestamp -> Fri_Jul_13_07:08:00_2012 

echo ${output[timestamp]} 

我創建了一個功能如何從shell中的函數返回關聯數組?

如何正確地從shell腳本函數返回一個關聯數組?

+0

讓他們成爲全球?我不確定是否有其他選擇。你使用哪一個shell(或一組shell) - 它很重要? POSIX沒有定義shell數組,索引或關聯,因此任何這種表示法都是普通POSIX shell的擴展(例如,由'dash'實現)。 –

+0

我正在使用'GNU bash,版本4.3.11'。我其實有一個需要轉換成數組的字符串列表。 –

回答

1

使用可怕的eval(如果你可以從process_ls_entry()信任輸出),你可以這樣做:

process_ls_entry() { 
    IFS=' ' read -r -a array <<< "$1" 
    declare -A LS_MAP 
    LS_MAP[entry]="${array[@]::1}" 
    LS_MAP[mode]="${array[@]:1:1}" 
    LS_MAP[size]="${array[@]:2:1}" 
    LS_MAP[num_blocks]="${array[@]:3:1}" 
    timestamp="${array[@]:4}" 
    timestamp=${timestamp// /_} 
    LS_MAP[timestamp]="${timestamp}" 
    # dump LS_MAP in shell reusable format 
    declare -p LS_MAP 
} 

然後稱其爲:

a="temp_dir drwxr-xr-x 0 0 Fri Jul 13 07:08:00 2012" 
tmp=$(process_ls_entry "$a") 

# use eval to declare same array with a different name output 
eval "${tmp/LS_MAP=/output=}" 

echo "${output[timestamp]}" 

輸出:

Fri_Jul_13_07:08:00_2012