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:~$