下面,我演示了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))}")
}