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 脚本中的函数正确返回关联数组?
使用 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)