3 回答

TA貢獻1831條經驗 獲得超10個贊
您可以使用以下內容將多個數組作為參數傳遞:
takes_ary_as_arg(){ declare -a argAry1=("${!1}") echo "${argAry1[@]}" declare -a argAry2=("${!2}") echo "${argAry2[@]}"}try_with_local_arys(){ # array variables could have local scope local descTable=( "sli4-iread" "sli4-iwrite" "sli3-iread" "sli3-iwrite" ) local optsTable=( "--msix --iread" "--msix --iwrite" "--msi --iread" "--msi --iwrite" ) takes_ary_as_arg descTable[@] optsTable[@]}try_with_local_arys
將回應:
sli4-iread sli4-iwrite sli3-iread sli3-iwrite --msix --iread --msix --iwrite --msi --iread --msi --iwrite

TA貢獻1868條經驗 獲得超4個贊
注意:在我沒有在Stack Overflow上找到答案之后,這是我自己發布的一些粗略的解決方案。它只允許傳遞一個數組,它是參數列表的最后一個元素。實際上,它根本沒有傳遞數組,而是傳遞了它的元素列表,這些元素通過called_function()重新組合成一個數組,但它對我有用。稍后Ken發布了他的解決方案,但我在這里保留了他的“歷史性”參考。
calling_function(){ variable="a" array=( "x", "y", "z" ) called_function "${variable}" "${array[@]}"}called_function(){ local_variable="${1}" shift local_array=("${@}")}
由TheBonsai改進,謝謝。

TA貢獻1833條經驗 獲得超4個贊
這個怎么運作
函數中的takes_ary_as_arg descTable[@] optsTable[@]
行try_with_local_arys()
發送:
這實際上是創建了函數可訪問的
descTable
和optsTable
數組的副本takes_ary_as_arg
。takes_ary_as_arg()
函數接收descTable[@]
和optsTable[@]
作為字符串,這意味著$1 == descTable[@]
和$2 == optsTable[@]
。在
takes_ary_as_arg()
函數的開頭,它使用${!parameter}
語法,稱為間接引用或有時雙引用,這意味著我們使用擴展值的值而不是使用值$1
$1
,例如:baba=booba variable=baba echo ${variable} # babaecho ${!variable} # booba
同樣的
$2
。把它放在一個數組(后面的括號)
argAry1=("${!1}")
創建擴展,就像直接寫在那里。在那里不是必需的。argAry1
=
descTable[@]
argAry1=("${descTable[@]}")
declare
NB:值得一提的使用該托架形式的數組初始化初始化根據新陣列IFS
或內部字段分隔符,其是通過默認標簽,換行和空間。在這種情況下,因為它使用了[@]
符號,所以每個元素本身都被看作是被引用(與之相反[*]
)。
我的預訂
在BASH
,局部變量范圍是當前函數和從它調用的每個子函數,這轉換為takes_ary_as_arg()
函數“看到”那些descTable[@]
和optsTable[@]
數組的事實,因此它正在工作(參見上面的解釋)。
既然如此,為什么不直接看看那些變量呢?這就像寫在那里:
argAry1=("${descTable[@]}")
參見上面的解釋,它只是descTable[@]
根據當前的值復制數組的值IFS
。
綜上所述
從本質上講,這通過沒有任何價值 - 像往常一樣。
我還要強調丹尼斯威廉姆森上面的評論:稀疏數組(沒有所有鍵定義的數組 - 其中帶有“孔”)將無法按預期工作 - 我們將松開鍵并“壓縮”數組。
話雖這么說,我確實看到了泛化的價值,因此函數可以在不知道名稱的情況下得到數組(或副本):
對于?“副本”:這種技術已經足夠好了,只需要意識到索引(鍵)已經消失了。
對于真實副本:我們可以使用eval作為密鑰,例如:
eval local keys=(\${!$1})
然后使用它們創建一個副本。注意:這里!
沒有使用它以前的間接/雙重評估,而是在數組上下文中它返回數組索引(鍵)。
當然,如果我們要傳遞
descTable
和optsTable
字符串(沒有[@]
),我們可以使用數組本身(如引用中所示)eval
。對于接受數組的泛型函數。
添加回答
舉報