Bash

保存函式結果的全域變數的名稱是否有任何約定?

  • May 16, 2017

shell 函式“返回”其結果的典型方法是將其分配給某個全域變數。

這個變數的名稱是否有任何約定/最佳實踐?

REPLY通常用於此。它由readselectin使用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。有一些方法可以使它在中工作bashmkshyash通過利用 的錯誤unset,但我不會去那裡,因為將來可能會修復錯誤。

另一種方法是不在您的函式中使用局部變數來設置除$1, $2… 位置參數之外的任意變數。不過,這可能會導致程式碼非常不可讀。例如,參見getopts_longshell 函式的實現。

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