2015-04-06 73 views
1

我有一个函数壳功能到IAM的尝试发送阵列元件 -传递参数通过引用

for ((idx=5 ; idx < ${#arr[*]} ; idx++)); do 
      escape_html ${arr[idx]} 
    done 
function escape_html() { 
x=$1 
out="${x/>/%gt;}" 
out="${x/</%lt;}" 
} 

我想他们是否有要被改变的数组元素的值>或<后的函数调用(就像我们在调用引用中使用的一样)。在这段代码中,Iam将值传递给另一个变量。 Idont想要这样做。我想直接根据我的观点进行这样的操作,并希望下次尝试访问这些阵列元素时反映这些更改。

+1

将'escape_html'函数的结果赋值给循环中的数组索引。 –

+1

使用前定义功能。 – Cyrus

+0

@EtanReisner其实我们正在处理一个字符串(参数)。所以我不能返回它,因为函数只能返回整数 – user2813853

回答

2

如果要正确执行此操作,请循环使用array[idx]=$(yourfunction "${array[idx]}")更新自己的引用。


如果你真的想这样做,你打算反正顺便说一句,这是不好的做法,以及具有与特殊变量和范围的一些注意事项,通过名称和索引而不是值,然后assign and reference indirectly

#!/bin/bash 
modify_arguments() { 
    local var=$1 
    local value=${!var} 
    printf -v "$var" "${value//foo/bar}" 
} 

array=(food foodie fool fooled) 

echo "Before: $(declare -p array)" 
for i in {2..3} 
do 
    modify_arguments "array[i]" 
done 
echo "After: $(declare -p array)" 

输出:

Before: declare -a array='([0]="food" [1]="foodie" [2]="fool" [3]="fooled")' 
After: declare -a array='([0]="food" [1]="foodie" [2]="barl" [3]="barled")' 
2

可变idx和阵列arr是全局变量,没有必要通过的功能。

#!/bin/bash 

function escape_html() { 
    arr[idx]="${arr[idx]/>/%gt;}" 
    arr[idx]="${arr[idx]/</%lt;}" 
} 

arr=(foo foo foo foo foo "<html>" "<xml>" "<bar>") 

for ((idx=5 ; idx < ${#arr[*]} ; idx++)); do 
    echo ${arr[idx]}   # before function call 
    escape_html 
    echo ${arr[idx]}   # after funtion call 
done 
+0

如果我在循环之后给printf“ $ {arr [5]} \ n”,Iam得到一个错误:printf:';':无效的格式字符。你知道为什么会这样吗? – user2813853

+0

使用'printf'%s \ n“” $ {arr [5]}“'。 – Cyrus

+0

非常感谢:) – user2813853