首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash4.xAssoc数组在接收函数中丢失键

Bash4.xAssoc数组在接收函数中丢失键
EN

Stack Overflow用户
提问于 2014-04-25 23:03:02
回答 1查看 347关注 0票数 3

我试图将一个关联数组从一个函数传递到另一个函数,并且正在丢失命名的索引键(例如,filepath,下面的搜索示例),尽管传入的数组可以使用索引0、1正确地访问其元素。我肯定对bash语法做了一些轻微的错误,但无法完全确定在哪里。任何帮助都很感激。

使用GNU bash,Ubuntu14.04中的4.3.8版本是bash代码示例,底部是输出

代码语言:javascript
复制
#! /bin/bash

function test_function {

    func_data=("${@}")
    # without brackets above cannot access func_data[1]

    # local ${!func_data}
    # the above local statement does not seem to help either way

    echo ""
    for K in "${!func_data[@]}"; do echo $K; done

    echo ""
    echo "func_data           : ${func_data}"
    echo "func_data[filepath] : ${func_data[filepath]}"
    echo "func_data[search]   : ${func_data[search]}"
    # all three echos above output first element of array, 
    # which is 'style "default" {' during first loop

    # Can access array elements 0, 1 but no longer via filepath, search
    echo "func_data[0]        : ${func_data[0]}"
    echo "func_data[1]        : ${func_data[1]}"

    echo "!func_data[@]       : ${!func_data[@]}"
    # echo above outputs '0 1' so indexes now are now zero based?
    echo "func_data[@]        : ${func_data[@]}"
    # echo above outputs all array elements 'style "default" { ~/.gtkrc-2.0'
}

# In BASH, local variable scope is the current function and every 
# child function called from it, so provide a function main to
# make it possible to utilize variable scope to fix issues

function main {

    echo ""
    declare -A gtkrc2=()
    gtkrc2[filepath]="~/.gtkrc-2.0"
    gtkrc2[search]="style \"default\" {"
    echo "gtkrc2 filepath : ${gtkrc2[filepath]}"
    echo "gtkrc2 search   : ${gtkrc2[search]}"
    test_function "${gtkrc2[@]}"

    echo ""
    declare -A gtkcss=()
    gtkcss[filepath]="~/.config/gtk-3.0/gtk.css"
    gtkcss[search]=".scrollbar {"
    echo "gtkcss filepath : ${gtkcss[filepath]}"
    echo "gtkcss search   : ${gtkcss[search]}"
    test_function "${gtkcss[@]}"
}

main
代码语言:javascript
复制
gtkrc2 filepath : ~/.gtkrc-2.0
gtkrc2 search   : style "default" {

func_data           : style "default" {
func_data[filepath] : style "default" {
func_data[search]   : style "default" {
func_data[0]        : style "default" {
func_data[1]        : ~/.gtkrc-2.0
!func_data[@]       : 0 1
func_data[@]        : style "default" { ~/.gtkrc-2.0

gtkcss filepath : ~/.config/gtk-3.0/gtk.css
gtkcss search   : .scrollbar {

func_data           : .scrollbar {
func_data[filepath] : .scrollbar {
func_data[search]   : .scrollbar {
func_data[0]        : .scrollbar {
func_data[1]        : ~/.config/gtk-3.0/gtk.css
!func_data[@]       : 0 1
func_data[@]        : .scrollbar { ~/.config/gtk-3.0/gtk.css
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-26 00:22:49

这可能是也可能不是这样做的“正确”方式,但这是我所能找到的最好的方法。欢迎其他人提出任何建议:

代码语言:javascript
复制
function test_function {
    arrname=$1
    idxlist="$2"

    echo ""
    echo "Array passed=$arrname"
    for idx in $idxlist; do
        elemname=$arrname[$idx]
        echo "idx=$idx, elem=${!elemname}"

    done
}

# In BASH, local variable scope is the current function and every 
# child function called from it, so provide a function main to
# make it possible to utilize variable scope to fix issues

function main {

    echo ""
    declare -A gtkrc2=()
    gtkrc2[filepath]="~/.gtkrc-2.0"
    gtkrc2[search]="style \"default\" {"
    echo "gtkrc2 filepath : ${gtkrc2[filepath]}"
    echo "gtkrc2 search   : ${gtkrc2[search]}"
    test_function gtkrc2 "${!gtkrc2[*]}"

    echo ""
    declare -A gtkcss=()
    gtkcss[filepath]="~/.config/gtk-3.0/gtk.css"
    gtkcss[search]=".scrollbar {"
    echo "gtkcss filepath : ${gtkcss[filepath]}"
    echo "gtkcss search   : ${gtkcss[search]}"
    test_function gtkcss "${!gtkcss[*]}"
}

main

特别是:

  • 为了将每个关联数组传递给函数,我们传递数组的名称及其索引列表。
  • 在函数内部,数组名称和索引列表是从位置参数中获取的。
  • 然后,我们可以遍历索引列表,并获得每个元素的相应值。这是通过首先生成元素的名称,然后使用! 间接修改器获得实际值来完成的。

这种间接数组的技术是在这个问题中描述的,但只处理索引数组,而不是关联数组;传递索引列表是我能想到的一种方法,可以使它对关联数组起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23304478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档