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脚本中正确地从函数返回关联数组?
3条答案
按热度按时间tvz2xvvm1#
使用可怕的
eval
(如果您可以信任process_ls_entry()
的输出),您可以执行以下操作:那么就叫它:
输出:
hmae6n7t2#
这里有一个选项,似乎做的伎俩。
n9vozmp43#
您可以通过返回字符串形式的关联数组,然后将该字符串分配给调用上下文中的新关联数组来完成此操作。
输出:
在Bash中,可以为关联数组分配一个字符串,该字符串只包含一个交替键和值的列表。
当赋值给关联数组时,复合赋值中的单词可以是需要下标的赋值语句,也可以是解释为交替键和值序列的单词列表:名称=(键1值1键2值2 ...). https://www.gnu.org/software/bash/manual/html_node/Arrays.html
可以使用
@K
参数扩展运算符将关联数组扩展为该形式。${参数@运算符}
展开是参数值的变换或参数本身的信息,取决于运算符的值。每个运算符是一个字母:
K:生成一个可能带引号的parameter值版本,但它将索引数组和关联数组的值打印为带引号的键-值对序列(请参见数组)。https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
在
@K
操作符之前使用[*]
或[@]
进行索引似乎没有任何区别。"${assoc[*]@K}"
和"${assoc[@]@K}"
都计算为同一个字符串。还有
@Q
,但它只扩展到值,不包括键。问:扩展是一个字符串,它是用引号括起来的参数值,格式可以重用为输入。
关联数组的另一个演示:
输出:
为了完整起见,下面是使用索引数组的相同演示:
输出: