我有一个Iam尝试发送数组元素的函数 -
for (( idx=5 ; idx < ${#arr[*]} ; idx++ )); do
escape_html ${arr[idx]}
done
function escape_html() {
x=$1
out="${x/>/%gt;}"
out="${x/</%lt;}"
}
我想要更改数组元素的值,如果它们具有&gt;或者&lt;在函数调用之后(正如我们在通过引用调用时那样)。在此代码中,Iam将值传递给另一个变量。 Idont想要这样做。我想直接对我的论点进行这样的操作,并希望下次我尝试访问那些数组元素时反映这些更改
答案 0 :(得分: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")'
答案 1 :(得分: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