Linux Shell編程學習筆記(2)

Linux Shell編程學習筆記(2015-7-12)

分類:linux shell

Shell變量

一:關於Shell變量

  Shell是一種弱類型的語言,變量存儲的一切值都是字符串。Shell變量的本質上是一個鍵值對,即使用一個關鍵字來記錄或引用一個值。和其它強類型的編程語言不同,Shell變量不需要預先定義,或者說賦值即定義,而且可以引用未賦值的變量。在引用一個事先未賦值過值的變量時,該變量爲一個空的字符串。
  例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName

    biantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
    LazyBone1994
    biantiao@lazybone1994-ThinkPad-E430:~$ 

  在上面的例子中,myName一開始並沒有賦值,但仍然可以對它進行引用,只不過顯示的是一個空的字符串。與下面賦值過後的輸出形成對比。

注意:當在變量名後面緊跟一個由非空白字符開始的字符串時,爲了使變量名和其後的字符串區分開來,應該使用花括號“{}”將變量括起來。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"
    biantiao@lazybone1994-ThinkPad-E430:~$ cat ${postion}termio.h
    /* Compatible <termio.h> for old `struct termio' ioctl interface.
    This is obsolete; use the POSIX.1 `struct termios' interface
    defined in <termios.h> instead.  */

    #include <termios.h>
    #include <sys/ioctl.h>

但如果沒有使用花括號將產生以下的錯誤情況,如結果所示如果你不使用花括號而人爲地加上空格也將出錯:

    biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"
    biantiao@lazybone1994-ThinkPad-E430:~$ cat $positiontermio.h
    cat: .h: 沒有那個文件或目錄
    biantiao@lazybone1994-ThinkPad-E430:~$ cat $position termio.h
    cat: /usr/include/: 是一個目錄
    cat: termio.h: 沒有那個文件或目錄
    biantiao@lazybone1994-ThinkPad-E430:~$ 

二:Shell變量的兩個使用技巧

  • 使用unset命令將一個變量的值清除,例如:
    biantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
    LazyBone1994
    biantiao@lazybone1994-ThinkPad-E430:~$ unset myName
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName

    biantiao@lazybone1994-ThinkPad-E430:~$ 

  可以看到在對變量使用了unset命令後變量值變成了空字符串。
* 使用特殊變量引用 “${#變量名}” 可以得到變量的長度,即字符數。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ str="Hello World!"
    biantiao@lazybone1994-ThinkPad-E430:~$ echo Length of \"$str\" is ${#str}
    Length of "Hello World!" is 12
    biantiao@lazybone1994-ThinkPad-E430:~$ 

三:命令替換

  命令替換是一個將一個或多個命令的執行結果賦給變量的一種方法。實現的方法有兩種。一種是使用反引號“ `…` ”。另一種是“ $(…) ”。多個命令之間用分號;來分割。例如:

    biantiao@lazybone1994-ThinkPad-E430:~$ str=`pwd; who`
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $str
    /home/biantiao biantiao :0 2015-07-14 15:55 (:0) biantiao pts/3 2015-07-    14 17:08 (:0)
    biantiao@lazybone1994-ThinkPad-E430:~$ 

四:聲明變量的屬性

  使用declare和typeset來限定變量的屬性。常用的變量屬性有如下:
* -r 只讀
* -i 整數
* -a 數組
* -f 函數
* -x 導出變量

例如:將變量聲明爲整數,使其可以進行整數的運算。
如果沒有將其聲明爲整數類型,它會是這個樣子:

    biantiao@lazybone1994-ThinkPad-E430:~$ a=10
    biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
    a+10
    biantiao@lazybone1994-ThinkPad-E430:~$ 

將其聲明爲整數類型時:

    biantiao@lazybone1994-ThinkPad-E430:~$ declare -i a=10
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
    10
    biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
    20
    biantiao@lazybone1994-ThinkPad-E430:~$ 

個人思考:shell是一種弱類型的編程語言。如果沒有聲明變量類型的這種機制,那麼使用shell將很難進行數值計算。使用-i是聲明整型變量,那麼問題來了,shell能否進行浮點運算?如果能,那怎樣使用浮點運算?

五:數組變量

  在shell中,數組變量的聲明和使用的語法非常簡單,和C語言當中的語法類似。要注意的就是,在bash shell 中數組變量支持組合賦值,什麼是組合賦值,就是將多個值組合在一起同時賦值給數組中。比如下面的例子。

    biantiao@lazybone1994-ThinkPad-E430:~$ student=(張三 李四 王五 LazyBone1994)
    biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[0]}
    張三
    biantiao@lazybone1994-ThinkPad-E430:~$ echo $student
    張三
    biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}
    LazyBone1994
    biantiao@lazybone1994-ThinkPad-E430:~$ student[3]=趙六
    biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}
    趙六
    biantiao@lazybone1994-ThinkPad-E430:~$ 

從上面的例子可以看到,引用沒有帶下標的數組名student相當於引用下標爲0的數組元素student[0]。數組變量的賦值就是將值放在括號裏,每個值用空格隔開即可。

  有關數組的幾個特殊變量引用
- 使用“[] {數組名[@]}”來引用數組中所有非空元素。比如:

biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[3]=THU
biantiao@lazybone1994-ThinkPad-E430:~$ week[5]=SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[*]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[@]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$ 
  • {#數組名[*]}”和“ {#數組名[@]}”表示所引用數組中非空元素的個數。比如:
biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[6]=SUN
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${#week[@]}
4
biantiao@lazybone1994-ThinkPad-E430:~$ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章