函数

时间:2016-06-10 18:27:20

标签: arrays bash reference

下面,我演示了bash(4.2.46)中用于数组操作的函数,以及push,pop,shift,unshift。您会注意到,即使我将数组的名称传递给函数并将其分配给变量array_name,该函数仅适用于硬编码数组array。这是因为我一直在用我的大脑,我的手指和互联网来试图确定允许我使用array_name代替的神奇的间接咒语符号,并且能够修改任何数组在这些功能。有人愿意接受它吗?

由于

更新即可。这个问题被标记为重复。我用这个问题来解决我的问题。 我将我的shell重新命名为使用Bash 4.3 +。

下面是我使用数组变量间接问题的解决方案

$ foo=

$ foo=()

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**

$ apush foo "item 1"

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 1

$ apush foo "item 2"

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 1
item 2

$ apush foo "item 3"

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 1
item 2
item 3

$ aunshift foo "item 0"

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 0
item 1
item 2
item 3

$ apop foo
item 3

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 0
item 1
item 2

$ ashift foo
item 0

$ echo '** foo array**' ; for i in "${foo[@]}"; do echo $i;done
** foo array**
item 1
item 2

## push, pop, shift, unshift:
## http://www.tech-recipes.com/rx/911/queue-and-stack-using-array/
## http://stackoverflow.com/questions/12691121/bash-array-expansion-using-variable-indirection-expansion
## http://stackoverflow.com/questions/23819839/assign-to-a-bash-array-variable-indirectly-by-dynamically-constructed-variable

##bash 4.3+: use declare -n to effectively create an alias ('nameref') of another variable

aclear ()
{
    declare -n array_alias="$1"
    array_alias=()
}

apush ()
{
    declare -n array_alias="$1"
    local item="$2"
    local count=${#array_alias[@]}
    ## index = 0 to count-1. Next element is [count]
    array_alias[$count]="$item"
}

alist ()
{
    local use_idx=0
    if [ "$1" = '--idx' ]
    then
        use_idx=1
        shift
    fi

    declare -n array_alias="$1"
    if [ "$use_idx" = 1 ]
    then
        for i in "${!array_alias[@]}"
        do
            printf "%s\t%s\n" "$i" "${array_alias[$i]}"
        done
    else
        for i in "${array_alias[@]}"
        do
            echo $i
        done
    fi
}

apop ()
{
    declare -n array_alias="$1"
    local item=${array_alias[((${#array_alias[@]}-1))]}
    array_alias=("${array_alias[@]:0:$((${#array_alias[@]}-1))}")
    echo $item
}

ashift ()
{
    declare -n array_alias="$1"
    local item=${array_alias[0]}
    array_alias=("${array_alias[@]:1}")
    echo $item
}

aunshift ()
{
    declare -n array_alias="$1"
    local item="$2"
    local i
    local j
    for (( i = ${#array_alias[@]} ; i > 0 ; i-- ))
    do
        ((j=i-1))
        array_alias[$i]="${array_alias[$j]}"
    done
    array_alias[0]="$item"
}

adelval ()
{
    declare -n array_alias="$1"
    local item=$2
    local i
    for (( i = 0 ; i < ${#array_alias[@]} ; i++ ))
    do
        if [ "$item" = "${array_alias[$i]}" ]
        then
            break
        fi
    done
    adelidx $i
}

adelidx ()
{
    declare -n array_alias="$1"
    local idx=$2
    array_alias=("${array_alias[@]:0:$idx}" "${array_alias[@]:$(($idx + 1))}")
}

0 个答案:

没有答案