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

标签 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]}

我创建了一个函数

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

最佳答案

使用可怕的 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

关于bash - 如何从shell中的函数返回关联数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40941671/

相关文章:

linux - 查找哪个程序运行另一个

linux - 网络脚本不起作用。 CentOS 2.6

linux - 如何将多个脚本作为一个脚本重定向到 bash

linux - 修改/etc/profile linux

bash - 在 Windows bash 子系统上安装 libxcb

bash - 错误 : Can't open display: (null) Failed creating new xdo instance on mac OS

php - 具有适当的 PHP 5.3 支持的 REPL/交互式 shell?

c++ - 用于编译和运行多个服务器和客户端的 Bash 脚本 c

在 shell 中重定向输入和输出的代码

arrays - 将两个 Bash 数组合并到键 :value pairs via a Cartesian product