Shell中單、雙引號,參數範圍和eval的問題學習

來源:互聯網
上載者:User

自訂一個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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.