-
變量
在進行腳本編程的時候,經常會使用到不同類型的變量,根據變量的生效范圍,可大致分為以下的幾類:
-
本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程,包括當前shell進程的子shell進程都是無效的,它的作用域就是當前shell進程
-
環境變量:生效范圍是當前shell進程及其子進程
-
局部變量:生效范圍是當前shell進程中某段代碼(通常為函數)
-
位置變量:$1,$2…表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
-
特殊變量:$?,$0,$*,$@,$#
-
$1,$…:對應第1,第2等參數,shift[n]換位置
-
$0:命令本身
-
$*:傳遞給腳本的所有參數,全部參數合為一個字符串
-
$@:傳遞給腳本的所有參數,每個參數為獨立字符串
-
$#:傳遞給腳本的參數的個數
注:$@ $* 只有在被雙引號包起來的時候才會有差異
-
習題
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該
IP地址不可訪問”
10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫
11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
12、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
13、計算1+2+3+…+100的值
14、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$@和$*都表示傳遞給腳本的所有參數,當如上圖中這樣使用時,它們的作用效果一樣,但當引用的時候分別加上參數時,它們兩個就有了區別,如下圖:
從上圖結果可以看出,使用了"$@"的位置變量,其輸出結果把輸入的三個數字當作了一個字符串,捆綁在了一起,所以輸入了三個數,但是就顯示了第一個數,而且第一個數就把所有數當作一個字符串輸出,第二第三個數就沒有輸出,使用了"$*"的位置變量,它的輸出結果就是正常的,雖然最后兩者輸出結果一樣,但兩者還是存在著是否當成一個整體輸出處理的區別
原創文章,作者:Stupid_L,如若轉載,請注明出處:http://www.www58058.com/33497
文章層次結構分明,態度端正,加油!!!