Bash

如何將數組作為函式參數傳遞但帶有其他額外參數?

  • May 30, 2022

以下文章解決方案按預期工作:

因此 - 從他的回答中:

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.

引用自:https://unix.stackexchange.com/questions/690603