Bash
保存函式結果的全域變數的名稱是否有任何約定?
shell 函式“返回”其結果的典型方法是將其分配給某個全域變數。
這個變數的名稱是否有任何約定/最佳實踐?
REPLY
通常用於此。它由read
和select
in使用bash
,至少。ksh``zsh
在
zsh
文件中:REPLY
此參數按慣例保留,用於在函式呼叫或重定向不可能或不希望的情況下在 shell 腳本和 shell 內置函式之間傳遞字元串值。read 內置命令和 select complex 命令可以設置 REPLY,並且文件名生成在評估某些表達式時設置並檢查其值。一些模組也出於類似目的使用 REPLY。
回复
As REPLY,但針對數組值而不是字元串。
不過,在更改該變數的類型時要注意潛在的影響。
另一種方法是將變數的名稱作為參數傳遞:
get_date() { local date date=$(date) eval "$1=\$date" }
如果
get_date
使用名為date
.ksh93
通過引入 namerefs 來解決這個問題,namerefs 是一種在呼叫者範圍內引用變數的方法。bash
最近添加了 nameref 支持,但它們引用同一範圍內的變數(僅按名稱),因此對此沒有用。function get_date { typeset -n var=$1 var=$(date) }
在
ksh93
中,即使稱為 ,它也有效get_date var
。有一些方法可以使它在中工作bash
,mksh
並yash
通過利用 的錯誤unset
,但我不會去那裡,因為將來可能會修復錯誤。另一種方法是不在您的函式中使用局部變數來設置除
$1
,$2
… 位置參數之外的任意變數。不過,這可能會導致程式碼非常不可讀。例如,參見getopts_long
shell 函式的實現。