Bash, sürüm 4.3, Şubat 2014 (?) 'Den bu yana, "eval" ın ötesinde, aynı faydalı performans ve dolaylı etki ile referans değişkenleri veya ad referansları (namerefs) için açık bir desteğe sahiptir ve bunlar komut dosyalarınızda daha net ve daha zor olabilir "'değerlendirmeyi' unut ve bu hatayı düzeltmek zorunda":
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
typeset [-aAfFgilnrtux] [-p] [name[=value] ...]
Declare variables and/or give them attributes
...
-n Give each name the nameref attribute, making it a name reference
to another variable. That other variable is defined by the value
of name. All references and assignments to name, except for⋅
changing the -n attribute itself, are performed on the variable
referenced by name's value. The -n attribute cannot be applied to
array variables.
...
When used in a function, declare and typeset make each name local,
as with the local command, unless the -g option is supplied...
ve ayrıca:
PARAMETRELERİ
Bir değişken veya başka bir değişkene bir başvuru oluşturmak için, değişkene declare veya yerel yerleşik komutlara -n seçeneği (aşağıda declare ve local açıklamalarına bakın) kullanılarak -bir seçeneği kullanılarak nameref niteliği atanabilir. Bu, değişkenlerin dolaylı olarak değiştirilmesine izin verir. Nameref değişkenine her başvuruda veya atandığında, işlem aslında nameref değişkeninin değeri tarafından belirtilen değişken üzerinde gerçekleştirilir. Bir nameref, kabuk işlevleri içinde, adı işleve argüman olarak iletilen bir değişkeni ifade etmek için yaygın olarak kullanılır. Örneğin, bir değişken adı kabuk işlevine ilk argümanı olarak iletilirse,
declare -n ref=$1
işlevin içinde, değeri ilk bağımsız değişken olarak iletilen değişken adı olan bir nameref değişkeni oluşturur. Ref'ye yapılan referanslar ve atamalar, adı $ 1 olarak geçen değişkene referanslar ve atamalar olarak kabul edilir. For döngüsünde kontrol değişkeni nameref özniteliğine sahipse, sözcük listesi kabuk değişkenlerinin bir listesi olabilir ve döngü yürütüldüğünde listedeki her sözcük için bir ad başvurusu oluşturulacaktır. Dizi değişkenlerine -n özelliği verilemez. Ancak, nameref değişkenleri dizi değişkenlerine ve abone dizi değişkenlerine başvurabilir. Aderefs, unset yerleşiminin -n seçeneği kullanılarak ayarlanamaz. Aksi takdirde, unset bağımsız değişken olarak bir nameref değişkeninin adıyla yürütülürse,
Örneğin ( DÜZENLEME 2 : (teşekkürler Ron)), nihayet doğru cevap vermesi gereken dış değişken çakışmalarını en aza indirmek için işlev-dahili değişken adını adlandırdı (önekledi), Karsten tarafından yapılan yorumlarda ortaya çıkan sorun):
# $1 : string; your variable to contain the return value
function return_a_string () {
declare -n ret=$1
local MYLIB_return_a_string_message="The date is "
MYLIB_return_a_string_message+=$(date)
ret=$MYLIB_return_a_string_message
}
ve bu örneği test etmek:
$ return_a_string result; echo $result
The date is 20160817
Bir işlevde kullanıldığında bash "declare" yerleşiminin varsayılan olarak bildirilen değişkeni "local" hale getirdiğini ve "-n" ifadesinin de "local" ile kullanılabileceğini unutmayın.
"Önemli deklarasyon" değişkenlerini "sıkıcı yerel" değişkenlerden ayırmayı tercih ederim, bu yüzden "deklare" ve "yerel" kelimelerini bu şekilde kullanmak dokümantasyon görevi görür.
DÜZENLEME 1 - (Karsten tarafından aşağıdaki yoruma verilen yanıt) - Daha fazla aşağıya yorum ekleyemiyorum, ancak Karsten'in yorumu beni düşündürdü, bu yüzden eğer okuduysanız, HASSAS - AFAICT - Karsten'i çalıştıran aşağıdaki testi yaptım, lütfen kesin bir set sağlayın Aşağıdaki adımların iyi çalıştığı için komut satırından test adımlarının var olduğunu varsayalım.
$ return_a_string ret; echo $ret
The date is 20170104
(Bunu hemen şimdi, yukarıdaki işlevi bir bash terimine yapıştırdıktan sonra - gördüğünüz gibi, sonuç gayet iyi çalışıyor.)
function funcName {
POSIX öncesi eski sözdizimi erken ksh'den miras alınır (burada bash'ın onur vermediği anlamsal farklılıklar vardı). yerinefuncName() {
nofunction
ile kullanılmalıdır; bkz. wiki.bash-hackers.org/scripting/obsolete