Bash
如何將數組作為函式參數傳遞但帶有其他額外參數?
以下文章解決方案按預期工作:
因此 - 從他的回答中:
function copyFiles() { arr=("$@") for i in "${arr[@]}"; do echo "$i" done } array=("one 1" "two 2" "three 3") copyFiles "${array[@]}"
這篇文章的原因是如果發生以下情況怎麼辦:
copyFiles "${array[@]}" "Something More" copyFiles "Something More" "${array[@]}"
**問題:**我確實意識到發送的參數,當它們收到函式中的參數時 - 它們實際上是合併的 - 因此
$1
並且$2
不再按預期工作,“數組”參數與另一個參數集成我已經做過研究:
可悲的是
typeset -n
不起作用並在:
沒有按預期工作-在該答案中有一條註釋表明存在問題-帶有展示測試/驗證的連結-關於數組大小(
${#array[@]}
)在函式中不同。那麼如何實現這個目標呢?
不可能像這樣將數組作為參數傳遞。即使看起來你這樣做了,但它並沒有像你期望的那樣工作
您的外殼(例如這裡:)將在執行功能之前
bash
擴展"${array[@]}"
到各個項目!所以這
copyFiles "Something More" "${array[@]}"
實際上會打電話
copyFiles "Something More" "one 1" "two 2" "three 3"
因此,在函式內部,無法將數組與其他參數區分開來。
(您可以 添加對數組的引用,但我反對使用它,因為它似乎不太便攜,而且如果沒有必要,您也不想混合範圍)。
您可以使用
shift
,例如copyFiles() { var1=$1 shift for i in "$@"; do ... ; done }
(注意,那
arr=("$@")
是多餘的,$@
已經是一個數組,你甚至不需要指定"$@"
,你也可以使用for i; do ...; done
)或使用類似
getopts
.