【发布时间】:2015-06-10 23:23:05
【问题描述】:
我想编写一个函数,它接受一个数组变量名并更新内容。例如:
ARRAY1=("test 1" "test 2" "test 3")
toUpper ARRAY1
for arg in "${ARRAY1[@]}"; do
echo "arg=$arg"
done
# output
arg=TEST 1
arg=TEST 2
arg=TEST 3
我做了一个粗略的尝试,这需要输入数组的副本。使用间接引用,我能够创建输入变量的副本。数组的副本用于获取元素的计数。如果有更好的方法,请告诉我。
function toUpper() {
local ARRAY_NAME=$1
local ARRAY_REF="$ARRAY_NAME[@]"
# use an indirect reference to copy the array so we can get the count
declare -a ARRAY=("${!ARRAY_REF}")
local COUNT=${#ARRAY[@]}
for ((i=0; i<$COUNT; i++)); do
local VAL="${ARRAY[$i]}"
VAL=$(echo $VAL | tr [:lower:] [:upper:])
echo "ARRAY[$i]=\"$VAL\""
eval "$ARRAY_NAME[$i]=\"$VAL\""
done
}
ARRAY1=( "test" "test 1" "test 3" )
toUpper ARRAY1
echo
echo "Printing array contents"
for arg in "${ARRAY1[@]}"; do
echo "arg=$arg"
done
【问题讨论】:
-
你的 BASH 版本是多少?
-
使用 BASH 4,但如果可能的话,如果解决方案适用于版本 3,那就太好了。
-
顺便说一句,非导出的 shell 变量的全大写变量名是错误的形式。根据 POSIX 规范 (pubs.opengroup.org/onlinepubs/009695399/basedefs/…):“包含小写字母的环境变量名称空间是为应用程序保留的”;由于环境变量和局部变量共享一个命名空间,使用小写名称可以防止意外覆盖环境变量和内置变量。
-
顺便说一句——最好避免使用
function关键字。它没有语义用途——function foo() { ...; }与 bash 中的foo() { ...; }具有完全相同的效果——但不必要地使代码与 POSIX sh 不兼容。
标签: arrays bash pass-by-reference indirection