Diğer cevaplarla ilgili sorun, ya bir çağrı zincirinde birkaç fonksiyon olduğunda üzerine yazılabilen bir global kullanmaları ya echo
da fonksiyonunuzun teşhis bilgisi veremediği anlamına gelir (fonksiyonunuzun bunu ve "sonucu", yani geri döndüğünü unutursunuz değeri, arayanın beklediğinden daha fazla bilgi içerecek, garip hataya yol açacak) veya eval
çok ağır ve hacky.
Bunu yapmanın uygun yolu, en üst düzey şeyleri bir işleve koymak ve local
bash'ın dinamik kapsamlandırma kuralını kullanmaktır. Misal:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
Bu çıktılar
nothing
hi
bye
Dinamik kapsam belirleme, ret_val
, arayana bağlı olarak farklı bir nesneyi gösterir! Bu, programlama dillerinin çoğunun kullandığı sözcük kapsamından farklıdır. Bu aslında belgelendirilmiş bir özelliktir , kaçırması kolaydır ve çok iyi açıklanmamıştır, işte bunun için belgeler (vurgu benimdir):
İşleve yerel değişkenler yerel yerleşik ile bildirilebilir. Bu değişkenler sadece fonksiyon tarafından görülebilir ve çağırdığı komutları.
Bir C / C ++ / Python / Java / C # / javascript deneyimi olan birini, bu büyük engel muhtemelen: bash fonksiyonları onlar komutlar vardır ve gibi davranırlar, fonksiyonlar değildir: bunlar çıktı için can stdout
/ stderr
onlar boru içinde can / out, bir çıkış kodu döndürebilir. Temel olarak bir komut dosyasında bir komut tanımlamak ve komut satırından çağrılabilen bir yürütülebilir dosya oluşturmak arasında bir fark yoktur.
Yani betiğinizi böyle yazmak yerine:
top-level code
bunch of functions
more top-level code
şöyle yaz:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
nerede main()
beyan ret_val
olaraklocal
ve diğer tüm fonksiyonları ile değerleri döndürür ret_val
.
Aşağıdaki Unix ve Linux sorusuna da bakın: Kabuk İşlevlerindeki Yerel Değişkenlerin Kapsamı .
Bir diğeri, duruma göre belki de daha iyi bir çözüm, biri ya.teck tarafından gönderildi hangi kullanır local -n
.
return
sizin durumunuz esasenexit code
hangi aralık ile aynıdır0 - 255
.echo
@Septi tarafından önerildiği gibi kullanın . Çıkış kodları ile yakalanabilir$?
.