自訂一個net函數,目的是從ifconfig的輸出結果中截取網卡的ip ,netmask和broadcast資訊
##ip netmask broadcastfunction net(){ name=$1 num=\$$2 /sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'}echo eth:net ip 2
上面函數先調用一次以輸出ip資訊為例:(結果)
l
可以看到輸出的結果完全不是想要的 ip 192.168.100.10
這是為什麼呢??
下面說一下我的錯誤處理過程(錯誤錯誤錯誤)
我是把函數改了一下
/sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'
改稱:
echo "/sbin/ifconfig -a | awk '{if ( $1 == "inet" && $5 == "broadcast") print "\t"$name $num}'"
輸出結果是:
分析一下:發現awk語句中的$1被替換成函數調用時傳進來的第一個參數了。就自以為這個問題錯誤發生在awk不能區分自身截取出的$1欄位和函數參數的$1段。
後來華哥幫忙看時告訴我這樣的輸出結果只是因為awk語句並沒有執行而只是被 echo語句做了簡單的弱引用替換成變數值。
下面來介紹一下shell中的強引用和弱引用,還是以執行個體分析:
a=testecho '$a'echo "$a"echo '"$a"'echo "'$a'"
運行結果:
解釋:
單引號: 強引用 (引號裡面的內容全部當成字串處理,如 echo '$a') 雙引號:弱引用(有變數時,變數會被替換 ,如 echo "$a")
單引號和雙引號都有時會以外面的為主(即外邊的引號類型決定其裡面內容是強引用還是弱引用,如 echo ' "$a" ':強引用 和 echo " '$a' " : 弱引用)
瞭解到上面的強引用和弱引用區別之後,回過頭來考慮一下原來的問題,錯誤分析方法如下:
看到上面的情況,可以看出:awk的單引號也是 “強引用”,所以導致$name 和 $num 都不能傳進入他們的值,所以都是空,awk就以兩個$0 輸出結果
那麼,“強引用”不可以,能不能把awk的單引號變成雙引號呢????? 試一下:
顯示語法錯誤說明不行,
可能有些朋友會問能不能用eval 語句(關於eval語句的使用講解,詳見下文)
測試一下:()
可見eval的功能不能在awk裡面使用
也就是說明這個函數的邏輯行不通,因為沒有辦法將函數的參數賦給awk。
下面我們再以一個函數例子來學習一下shell函數的傳回值問題
function cpuinfo(){ $1=`cat /proc/stat | grep 'cpu ' | awk '{print "$2" "$3" "$4" "$5" "$6" "$7" "$8}'` $2=`echo $1 | awk '{print $5}'` $3=`echo $1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`}cpuinfo Log1 idle1 cpu1echo $Log1 $idle1 $cpu1
說一下我函數的意圖,我是想將函數的第一條語句賦給傳進的第一個參數,以此類推.
運行以後發現錯誤
明顯這種變數賦值方法是錯誤的。那麼該如何才能實現自己的目的呢。
結合shell學習的知識。首先通過一個最簡單的例子介紹一下eval用法,再做錯誤更正測試:
可以看出:eval可讀取一連串的參數,然後再依參數本身的特性來執行。
關於 eval $v1=$vaaa;echo aaa:$aaa 和 eval "$v1=$vaaa";echo aaa:$aaa 的錯誤輸出如下:
為什麼會報這樣的錯誤。從上面的eval作用思考:命令變成了 aaa=This is aaa這樣當然會報錯。雙引號的弱引用也是這樣。
只有單引號的強引用變成aaa=$vaaa
想仔細學習eval可參考:http://www.cnblogs.com/huzhiwei/archive/2012/03/14/2395956.html
回到正題
我接下來做了如下測試:
就以為只要將例子中的變數a通過eval換成函數變數傳入的$1就可以了呢。就修改了函數的內容,並測試了一下。
發現還是錯誤。........................................................................................................................
最後還是決定使用另一種方法解決函數多次使用賦值的問題。如下:
這裡牽扯到了函數的變數值範圍知識點。它和c語言不同。這一點也可以通過上面的例子看出。
詳細學習可以看出參照文章:http://blog.csdn.net/ithomer/article/details/7954577