概述:
shell是一個工具程序,在用戶登錄后后系統啟動,它解釋并運行由命令或腳本文件輸入的命令,從而實現用戶與內核之間的交互。bash是Linux操作系統上默認的shell,在交互和編程兩方面,bash提供了許多Bourne shell沒有的功能,并且還結合了C shell和Kron shell最有用的功能。
bash的語法和結構
1、shbang行:
shbang行是腳本的第一行,它通知內核使用哪種shell解釋腳本中的行
#!/binbash
2、注釋:
注釋由一個#號后跟一些描述性的說明組成,它們可以從行的任意位置開始,在行的末尾結束。
2 #10user id add 20user id sum 3 #author:xiaoshui
3、顯示輸出
echo命令用于向屏幕顯示輸出,通配符必須使用反斜線和配對引號進行轉意
1 #!/bin/bash 2 #function: hello world 3 #author:xiaoshui 4 echo "hello world"
4、局部變量
局部變量的作用域被限定在當前的shell中,當一個腳本執行結束,它們不可再用。也就是說它們超出了作用域,生效范圍為當前shell進程中某代碼片斷(通常指函數)
5、本地變量
本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效。
[root@localhost ~]# var2=two //在當前shell中定義var2 [root@localhost ~]# chmod +x test1.sh [root@localhost ~]# ./test1.sh one [root@localhost ~]# vi test1.sh 1 #!/bin/bash 2 #test local var 3 var1=one 4 echo "$var1" 5 echo "$var2" //顯示不了父進程定義的var2
6、環境變量
生效范圍為當前shell進程及其子進程
[root@localhost ~]# unset var2 //取消var2的值 [root@localhost ~]# export var2=two //設置var2為環境變量 [root@localhost ~]# ./test1.sh //執行test1腳本 one two [root@localhost ~]# vi test1.sh 1 #!/bin/bash 2 #test local var 3 var1=one 4 echo "$var1" 5 echo "$var2" //調用父進程的var2
顯示所有環境變量:export,env,printenv
7、位置變量
$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
[root@localhost ~]# vi v2.sh 1 #!/bin/bash 2 #function: test //此實驗的目的就是為了測試$10是${10}還是$1+0 3 #author: xiaoshui 4 5 echo $10 6 echo $11 7 echo $12 8 echo "==========" 9 echo ${10} 10 echo ${11} 11 echo ${12} [root@localhost ~]# ./v2.sh a b c d e f g h i j k l a0 //很顯然,結果為$1+0 a1 //同樣結果為$2+1 a2 ========== j //顯然此為${10} k //${11} l
上述例子表明,位置變量$1..$9中,變量引用沒有問題,當到了$10以后,此時如果不把10用花括號括住,則會被識別為$1+#(#為數字)
8、特殊變量
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
[root@localhost test]# vi test2.sh 1 #!/bin/bash 2 # test 3 echo "file name: $0" 4 echo "first argue: $1" 5 echo "two argue: $2" 6 echo "all argues: "$*"" 7 echo "all argues: "$@"" 8 echo "argue numbers: $#" 9 touch file_"$*" //利用touch來測試$*和$@的區別, 10 touch file."$@" // [root@localhost test]# ./test2.sh 1 2 3 file name: ./test2.sh first argue: 1 two argue: 2 all argues: 1 2 3 all argues: 1 2 3 argue numbers: 3 [root@localhost test]# ll total 4 -rw-r--r-- 1 root root 0 Aug 12 16:28 2 //詞尾$@第二個 -rw-r--r-- 1 root root 0 Aug 12 16:28 3//此為$@第三個 -rw-r--r-- 1 root root 0 Aug 12 16:28 file.1//此為$@第一個 -rw-r--r-- 1 root root 0 Aug 12 16:28 file_1 2 3//仔細觀察可以發現此為$* -rwxr-xr-x 1 root root 189 Aug 12 16:28 test2.sh
由上述例子可以得出,$*全部參數合為一個字符串,$@每個參數為獨立字符串
課后作業:
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目錄中共有多少個一級子目錄和文件
7、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
8、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
9、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫
10、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
11、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問
12、計算1+2+3+…+100的值
13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
備注:第十一題和第十三題注釋區域有疑問。
原創文章,作者:我的滑板鞋,如若轉載,請注明出處:http://www.www58058.com/34005
總結的很詳細,思路很清晰,作業完成的很用心,再接再厲,