首先,我閱讀了有關傳遞陣列的一般資訊——我看到的所有示例首先為陣列創建了臨時變數,然后傳遞了它。摘自https://stackoverflow.com/a/26443029/210342
show_value () # array index
{
local -n myarray=$1
local idx=$2
echo "${myarray[$idx]}"
}
shadock=(ga bu zo meu)
show_value shadock 2
有沒有辦法將陣列直接作為文字傳遞,即不創建臨時變數?
我嘗試了一種簡單的方法,只是用資料替換名稱,但是我在“(”上出現了語法錯誤。
更新:
我使用 openSUSE Leap 15.3 和 bash 4.4。上面的代碼當然有效,但我想將呼叫更改為:
show_value (ga bu zo meu) 2
即直接傳遞陣列資料(不使用額外的變數)。
uj5u.com熱心網友回復:
如果要更改引數的順序:
show_value () # index array_element [...]
{
local idx=$1
local -a myarray=("${@:2}")
echo "${myarray[$idx]}"
}
然后
shadock=(ga bu zo meu)
show_value 2 "${shadock[@]}" # => zo
如果要將索引保留為最后一個引數,則
show_value () # array_element [...] index
{
local -a myarray=("${@:1:$#-1}")
local idx=${!#}
echo "${myarray[$idx]}"
}
show_value "${shadock[@]}" 2 # => zo
local -n myarray=$1
肯定比這更整潔,不是嗎?它也會更快,記憶體效率更高——您不必復制所有資料。
uj5u.com熱心網友回復:
函式引數的結構不足以處理陣列等嵌套資料結構。引數是一個簡單的字串串列,就是這樣。
您可以行內擴展陣列:
show_value "${shadock[@]}" 2
但是分隔符丟失了。無法知道陣列的開始和結束位置,因為它擴展為:
show_value ga bu zo meu 2
您必須自己弄清楚陣列邊界。選項包括:
如果命令只有一個陣列引數,請將其設為最后一個。這是許多采用多個檔案名的傳統 UNIX 工具所做的。例子:
ls <file>...,chmod <mode> <file>...。如果在陣列之前/之后有固定數量的引數,您可以將陣列放在中間,這樣您就可以明確地確定陣列的位置。例子:
cp <file>... <dir>。如果你有多個陣列,你可以要求用戶用
--. 許多 git 更復雜的子命令都這樣做。
我警告不要將陣列名稱作為引數。這是一種非常特定于 shell 的技術。將來很難將函式轉換為成熟的腳本或二進制檔案。
uj5u.com熱心網友回復:
你能考慮一下這個語法嗎:
show_value () # array index
{
local -a myarray=$1
local idx=$2
echo "${myarray[$idx]}"
}
show_value "(ga bu zo meu)" 2
出于安全原因,您需要確定傳遞給函式的陣列的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/363375.html
