2015-04-06 108 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