Sorunuzu tamamen cevapladım, ama umarım yardımcı olur. Bazı genel konulara, daha sonra da varsayılan ağ geçidindeki özelliklere ve nihayet bazı diğer örneklere dokundum.
İşte bazı genel yorumlar:
Bu çağrıları, başka şeylerin yanı sıra, işlevlerinizi oluşturmanıza izin verecek fonksiyonlara dönüştürmenizi öneririm, böylece daha yüksek seviyeli fonksiyonlar basitçe bir veya daha fazla seviyeli fonksiyonun etrafına sarılabilir.
Çıktıyı bir fonksiyondan ele almak için stdout'u kullanmanın en çok yönlü yöntem olduğunu ve geliştirme işlevlerinin modüler / sarıcı yaklaşımına kendisini kattığını gördüm.
Değişken atama yapar ve bir işlevden dışa aktarırsanız, kapsam sorunları size sorunlara neden olur.
Kendini aynı işlevin içindeki bir değişkene atayan bir işleve sahipseniz; Örneğin
`testFx() { export routeInfo="$(route)"; }`
Eğer 'testFx' ile routeInfo değişkenine atama arayanla aynı kapsamdaysa - başka bir deyişle, işlev geçerli kabukta bildirilirse ve mevcut kabuktan çağrılırsa, değişken rotaInfoya yapılan sonuç atamasına erişilebilecektir. kabuk. İşlevi bir infaz komut dosyasında kullanılırsa fonksiyonu olmasına rağmen, sonuç, senaryoyu denilen kabuğuna erişilemez olacaktır erişilebilir.
Bu biraz fazla basitleştirme, ancak kapsam sorununu iyi netleştirdiğini düşünüyorum. Bir ebeveyni kapsamındaki nesnelere bir çocuk kabuğu / işlemi tarafından erişilebilir, fakat bunun tersi mümkün değildir. Çizgileri (bash olarak) 'geri almak' zordur.
Bu fark, bir komut dosyası kaynaklanırken bir komut dosyası çalıştırırken görülen farklı davranışlarda ortaya çıkar.
Yürütülen komut dosyası bir alt / alt kabukta çalışır; kaynak dosya yerel ortama mevcut bağlamda eklenir; alt / alt kabukta değil.
Söylediklerimi kabuğunuza bu basit işlevi ekleyerek test edebilirsiniz - basitçe yapıştırın (veya .bashrc ekleyin ve kabuğu yeniden yükleyin, vb.)
Sonra işlevi çağırın ve değeri tutan değişkeni yankılanmaya çalışın echo $routeInfo
. Beklendiği gibi çalışacak.
Bu değişkeni ile temizle unset routeInfo
Sonra aşağıdaki gibi basit bir komut dosyası oluşturun:
vi ~/test.sh
içeriği ile:
#!/bin/bash
testFx
Yürütme izinlerini kaydedin, kapatın ve ekleyin chmod +x ~/test.sh
Ardından betiği ~/test.sh
, içinde bu işlevi tanımlanmış olan bir kabuktan çalıştırın .
Komut dosyasını çalıştırdıktan sonra, değeri tutması gereken değişkeni tekrarlayın: echo $routeInfo
ve boş olduğunu göreceksiniz - yukarıdaki unset çağrısını yaptığınızı varsayarak; çünkü dışa aktarma ana kabuğa / işleme yükselemedi.
Bu kapsam sorunu ve bir bash işlevinden geleneksel bir “return” değeri olmaması nedeniyle, genellikle kullanılan bir bash işlevinden 'sonucu' değerini doğrudan görüyorum; çıktıyı stdout'a bırakarak veya değişkende yakalayarak. Her iki durumda da, fonksiyonun kendisi aynı şekilde yazılır, yalnızca çağrılma şekli değişir.
İşte bash fonksiyonlarından çıkan bazı 'grabbing' çıkış değerleri örnekleri
rslt=$(testFx)
: Birden fazla sonuçlar beklemek durumunda, bir dizi sonuçları saklayabilir
rslt=($(testFx))
ile ${#rslt[@]}
girişlerinin sayısını (N) ihtiva eden ve ya doğrudan indeksleme elementlerin erişebilir:
${rslt[$a]}
a = 0 N-1'e
veya bir döngü ile:
for i in ${rslt[@]}; do echo "$i"; done
Umarım bu sorunuzun iyi bir bölümünü ele almıştır. Yerel makinemde bulunan birkaç ağ veri toplama fonksiyonunu kullanıyorum. Başka herhangi bir özel bilgi arıyorsanız bana bildirin, muhtemelen bunun için bir işlevim var.
getExternalIP () {
lynx -dump -hiddenlinks=ignore -nolist http://checkip.dyndns.org:8245/ | grep "Current IP Address" | cut -d":" -f2 | cut -d" " -f2
}
getLanIP () {
ip addr show | grep -E -v '127\.0' | grep -Eo '^.*brd' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
}
getDefGW_IP () {
route -n | awk '/UG/ {print $2}';
}
getDefGW_Host () {
route | awk '/default/ {print $2}';
}
getDefGW_Host_and_IP () {
echo "Def. GW hostname / IP Address: $(getDefGW_Host) / $(getDefGW_IP)";
}
IP adresleriyle çalışırken kullanabileceğiniz yararlı bir regex dizesi:
iprgx='(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
Bunu kullanan örnek - LAN'ınızda ARP paketlerini gördüğünüz tüm IP adreslerini çıkaran bir işlev:
getARPTable_IPs() {
arp -na | grep -Eo "$iprgx";
}
Sonuçları bir dizide saklayın:
arpIPs=($(getARPTable_IPs))
Son olarak, modern bir Linux dağıtımı için, ağ bilgisi / durumu elde etmek için sıklıkla kullandığım komutlar ve dosya sistemi konumları. Netstat ve ifconfig gibi eski komutlar kullanımdan kaldırılmıştır ve iyi sebeplerden dolayı.
- ip
- ss
- Altında / sys / class / net, sisteminizdeki her NIC için ağ bilgilerini içeren dosyalarla dolu bir dizin olacaktır.
a. Komut satırı yardımcı programlarının çoğu bu çıktıyı kullanır ve yeniden biçimlendirir.
b. / proc / net pek çok bilgiye sahip.
c. Örneğin, arp -na
komut tamamen tarafından kopyalanabilir.cat /proc/net/arp
- iptables