【问题标题】:How to perform different actions based on array name in bash?如何根据 bash 中的数组名称执行不同的操作?
【发布时间】:2021-10-04 22:05:06
【问题描述】:

目前我有一个对数组名称进行硬编码以执行特定操作的函数。我想将需要处理的数组名作为函数参数传递,然后根据数组名执行特定的动作。如何在 bash 中实现这一点?

现在:

# array definition
declare -A array1=(
 ["a"]="apple"
 ["b"]="banana"
)

# function definition
process(){
    echo "printing letters and fruits"
    for letter in "${!array1[@]}"; do
        fruit="${array1[$letter]}"
        echo "$letter: $fruit"
    done
}

# commands
process

想要的(代码错误!):

# array definition
declare -A array1=(
 ["a"]="apple"
 ["b"]="banana"
)

declare -A array2=(
 ["a"]="ant"
 ["b"]="bear"
)

# function definition
process(){
     arrayname="$1"
     case "$arrayname" in
         "array1")
             echo "printing letters and fruits"
             for letter in "${!arrayname[@]}"; do
                 fruit="${arrayname[$letter]}"
                 echo "$letter: $fruit"
             done
         ;;
         "array2") 
             echo "printing animals only"
             for letter in "${!array1[@]}"; do
                 animal="${array2[$letter]}"
                 echo "$animal"
             done
         ;;
    esac
}

# commands
process array1
process array2

【问题讨论】:

    标签: arrays bash variables switch-statement associative-array


    【解决方案1】:

    你必须做两件事:首先,清理你的变量名——有时你在process函数中使用arrayname,有时是array1array2。其次,使用declarelocal 制作一个nameref(一个特殊的变量,当设置为另一个变量的名称时,其作用类似于那个):

    #!/usr/bin/env bash
    
    # array definition
    declare -A array1=(
     ["a"]="apple"
     ["b"]="banana"
    )
    
    declare -A array2=(
     ["a"]="ant"
     ["b"]="bear"
    )
    
    # function definition
    process(){
         local -n arrayname="$1"
         case "$1" in
             "array1")
                 echo "printing letters and fruits"
                 for letter in "${!arrayname[@]}"; do
                     fruit="${arrayname[$letter]}"
                     echo "$letter: $fruit"
                 done
             ;;
             "array2")
                 echo "printing animals only"
                 for letter in "${!arrayname[@]}"; do
                     animal="${arrayname[$letter]}"
                     echo "$animal"
                 done
             ;;
        esac
    }
    
    # commands
    process array1
    process array2
    

    【讨论】:

    • +1 用于-n 参考,但考虑到代码仍在使用case 的数组名称进行调度,我认为这有点没用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多