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

Bash 通过引用将参数传递给shell函数,bash,shell,reference,Bash,Shell,Reference,我有一个函数,我正试图将数组元素发送到该函数- for (( idx=5 ; idx < ${#arr[*]} ; idx++ )); do escape_html ${arr[idx]} done function escape_html() { x=$1 out="${x/>/%gt;}" out="${x/</%lt;}" } for((idx=5;idx/%gt;}” out=“${x/如果要正确执行此操作,请让循环使用array[i

我有一个函数,我正试图将数组元素发送到该函数-

for (( idx=5 ; idx < ${#arr[*]} ; idx++ )); do
            escape_html ${arr[idx]} 
    done
function escape_html() {
x=$1
out="${x/>/%gt;}"
out="${x/</%lt;}"
}
for((idx=5;idx<${arr[*]};idx++);做
escape\u html${arr[idx]}
完成
函数escape_html(){
x=1美元
out=“${x/>/%gt;}”

out=“${x/如果要正确执行此操作,请让循环使用
array[idx]=$(您的函数“${array[idx]}”)
更新自己的引用


如果您真的想按您提出的方式进行操作,这是一种不好的做法,并且有一些与特殊变量和范围相关的警告,请传递名称和索引,而不是值,然后:

产出:

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

如果要正确执行此操作,请让循环使用
array[idx]=$(您的函数“${array[idx]}”)
更新自己的引用


如果您真的想按您提出的方式进行操作,这是一种不好的做法,并且有一些与特殊变量和范围相关的警告,请传递名称和索引,而不是值,然后:

产出:

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

变量
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
!/bin/bash
函数escape_html(){
arr[idx]=“${arr[idx]/>/%gt;}”

arr[idx]=“${arr[idx]/变量
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
!/bin/bash
函数escape_html(){
arr[idx]=“${arr[idx]/>/%gt;}”

arr[idx]=“${arr[idx]/将
escape\u html
函数的结果分配给循环中的数组索引。在使用之前定义函数。@EtanReisner实际上我们在这里处理的是一个字符串(参数)。因此,我无法返回它,因为函数只能返回整数。您完全可以捕获函数的输出,在本例中,它是“结果”“和所需的值。将
escape\u html
函数的结果分配给循环中的数组索引。在使用之前定义函数。@EtanReisner实际上我们在这里处理的是一个字符串(参数)。因此,我无法返回它,因为该函数只能返回整数。您完全可以捕获函数的输出,在本例中,它是“结果”和所需的值。如果我给出printf“${arr[5]}\n”在for循环之后,我得到一个错误:printf:`;':无效的格式字符。你知道为什么会发生这种情况吗?使用
printf“%s\n”“${arr[5]}”
。如果我给printf“${arr[5]}\n”在for循环之后,我收到一个错误:printf:`;':无效的格式字符。您知道为什么会发生这种情况吗?请使用
printf“%s\n”“${arr[5]}