通过引用将参数传递给shell函数

时间:2015-04-06 16:21:20

标签: bash shell reference

我有一个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想要这样做。我想直接对我的论点进行这样的操作,并希望下次我尝试访问那些数组元素时反映这些更改

2 个答案:

答案 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