如何从 shell 中的函数返回关联数组?

Ani*_*dey 6 bash shell

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]}
Run Code Online (Sandbox Code Playgroud)

我创建了一个函数

如何从 shell 脚本中的函数正确返回关联数组?

anu*_*ava 2

使用 dreaded 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
}
Run Code Online (Sandbox Code Playgroud)

然后将其称为:

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]}"
Run Code Online (Sandbox Code Playgroud)

输出:

Fri_Jul_13_07:08:00_2012
Run Code Online (Sandbox Code Playgroud)