這兩天初次接觸shell編程,所謂shell編程其實就是用一定的語法將各種基本的命令組合起來,讓shell程序去解釋執行。如果對windows的dos有了解,可以這樣理解,其實shell腳本文件和.bat批處理文件差不多,不過linux下的shell比起windows的dos強大很多。
shell有很多種,如bash、sh 、tcsh、 ksh等,linux系統里面默認使用的是bash。
下面看一下學習shell的第一個程序:
輸入命令vi my_01.sh,創建一個my_01.sh文件並用vi編輯器打開。編輯內容如下:
1 #!/bin/bash 2 echo "aaaa" 3 echo "第一次接觸shell"
這里第一行是指讓bash這個shell去執行這個shell程序。echo是用來輸出的,第二行和第三行分別輸出兩句話。
執行這個shell程序可以用如下幾種方法:
1 ./my_01.sh
2 . my_01.sh
3 bash my_01.sh
注:新創建的文件默認是沒有執行權限的,所以必須給該文件授予執行權限后才能執行。授權命令:chmod u+x my_01.sh或者chmod 755 my_01.sh
下面是第二個shell程序:
1 #!/bin/bash 2 #my_02.sh 3 read -p "please input your name:" name 4 echo "$name,welcome!"
這里第三行read命令是指等待用戶輸入,-p后面是指提示,它還有一個參數-t是設置等待時間的。這個程序運行結果如下:
[liuling@bogon test]$ ./my_02.sh
please input your name:liuling
liuling,welcome!
注:第四行echo使用的是雙引號,如果使用單引號的話,則這句就會直接輸出 $name,welcome! 。雙引號是可以解析里面的變量的,而單引號則不行。
下面看看shell腳本的語法:
一、條件判斷if else的使用
if分支語句的寫法:
if 條件測試 then 滿足條件執行什么 else 不滿足條件執行什么 fi
多分支寫法:
if 條件1 then 執行命令2 elif 條件1 then 執行命令2 else 執行命令3 fi
注:if和fi要配對,以fi結束這個條件判斷。在不滿足第一個條件下再判斷使用的是elif,而不是else if。then必須獨占一行。
下面看幾個例子:
1 #!/bin/bash 2 #my_03.sh 3 4 read -p "pelease input your name:" name 5 read -p "pleaase input your password:" passwd 6 #if test $name = "liuling" 7 if [ $name = "liuling" -a $passwd = "lz19921009" ] 8 then 9 echo "登錄成功!" 10 else 11 echo "登錄失敗!" 12 fi
1 #!/bin/bash 2 #my_04.sh 3 4 read -p "please input your score:" score 5 6 if [ $score -gt 90 ] 7 then 8 echo "優秀!" 9 elif [ $score -gt 80 -a $score -le 90 ] 10 then 11 echo "良好!" 12 else 13 echo "一般!" 14 fi
1 #!/bin/bash 2 #my_05.sh 3 4 read -p "please input your score:" score 5 #如果使用(())的話,只能用< > >= <= 6 if (( $score > 90 )) 7 then 8 echo "優秀!" 9 elif [[ $score -gt 80 && $score -le 90 ]] 10 then 11 echo "良好!" 12 else 13 echo "一般!" 14 fi
測試用戶輸入的文件名是目錄還是文件:
1 #!/bin/bash 2 #my_06.sh 3 4 read -p "請輸入一個目錄或者文件名:" name 5 if [ -z $name ] 6 then 7 echo "你輸入的信息為空!" 8 else 9 if [ -f $name ] 10 then 11 echo "這是一個文件!" 12 elif [ -d $name ] 13 then 14 echo "這是一個目錄!" 15 else 16 echo "不存在這樣一個目錄或者文件!" 17 fi 18 fi
這三個例子都是關於if條件判斷的用法。條件有這么幾種寫法:[ 條件 ]、test 條件、[[ 條件 ]]、(( 條件 )),用的最多的是第一種。常用判斷符號如下
①、邏輯運算符
-a expr1 -a expr2 邏輯與
-o expr1 -o expr2 邏輯或
! !expr1 邏輯非
②、數值判斷
-eq num1 -eq num2 是否相等
-ne num1 -ne num2 是否不相等
-gt num1 -gt num2 是否大於
-ge num1 -ge num2 是否大於等於
-lt num1 -lt num2 是否小於
-le num1 -le num2 是否小於等於
③、字符串判斷
= str1 = str2 字符串是否相等
!= str1 != str2 字符串是否不等
-n -n str1 字符串長度是否不等於0
-z -z str2 字符串長度是否等於0
④、文件判斷
-r -r filename 文件是否存在且可讀
-w -w filename 文件是否存在且可寫
-s -s filename 文件是否存在且長度非0
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一個目錄
在使用條件判斷的時候一定要注意空格,如if [ $name = "liuling" -a $passwd = "lz19921009" ],[]里面前后要有一個空格,所有的判斷符號以及邏輯運算符號前后都要有空格,否則會報錯。使用[[ 條件 ]]的時候只能使用"&&"符號作為邏輯與來代替"-a",如果使用(( 條件 ))的話,只能用< > >= <=符號,而不能使用“-eq”等符號。
二、case的用法
這里的case優點類似於java中的swith case
case語法如下:
case var in pattern 1) 執行語句1 ;; pattern 2) 執行語句2 ;; pattern 3) 執行語句3 ;; *) 執行語句4 ;; esac
注意:*)指匹配其他任意字符串
每種情況都以;;結束
下面是幾個case用法的例子
1.模擬菜單的選擇
1 #!/bin/bash 2 #my_07.sh 3 4 echo "1 - 普通顯示" 5 echo "2 - 詳細顯示" 6 echo "3 - 顯示隱藏文件" 7 echo "4 - 推出" 8 9 read -p "請選擇操作號:" num 10 case $num in 11 1) 12 ls ;; 13 2) 14 ls -l ;; 15 3) 16 ls -al ;; 17 4) 18 exit ;; 19 *) 20 echo "請輸入正確的操作(1--4)" 21 exit ;; 22 esac
三、循環語句的使用
1、for循環
for 變量名 in 取值列表 do 命令序列 done
下面是for循環使用的小例子:
1 #!/bin/bash 2 #my_08.sh 3 4 for a in `seq 1 3 10` 5 do 6 echo $a 7 done 8 echo "-------------------" 9 for ((i=1;i<=10;i++)) 10 do 11 echo $i 12 done
這里第四行使用了`seq 1 3 10`,``是反引號,也就是鍵盤上Esc下面的一個鍵,``里面可以寫執行命令,把執行后的結果返回。
seq命令是指序列,seq start size max,start是起始,size是步長,max就是限制的數,比如seq 1 3 10,則返回的是1 4 7 10。
第9行代碼也有點特別,有點像java里面的for循環,不過是雙重小括號,在shell中這樣也是可以的。
下面是一個統計文件數目的小程序:
1 #!/bin/bash 2 #my_09.sh 3 4 i=0 5 for name1 in `ls /etc` 6 do 7 # i=`expr $i + 1` 8 # let i++ 9 # i=$[$i + 1] 10 # i=$(($i + 1)) 11 ((i++)) 12 13 done 14 echo "文件總數為:$i"
注:7、8、9、10、11行是數字自增的不同寫法,都可以。
2、while循環
while 條件 do 命令序列 done
下面是一個錄入客戶資料的shell腳本:
1 #!/bin/bash 2 #my_10.sh 3 4 while true 5 do 6 echo "登記客戶資料(c繼續,q退出):" 7 read choice 8 9 case $choice in 10 c) 11 echo "請輸入客戶名字:" 12 read name1 13 echo "請輸入客戶年齡:" 14 read age1 15 echo "姓名:"${name1}" - 年齡:"${age1} >>customer.txt 16 ;; 17 q) 18 exit 19 ;; 20 esac 21 done
注:
>>是指重定向,將標准輸出重定向到其他的輸出流中,如上面15行是指將標准輸出重定向到customer.txt文件。所以echo輸出的內容會輸出到customer.txt文件中去。
>> 和 > 區別
>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在會自動創建。
>customer.txt 就會重新寫入, 覆蓋原有的數據
四、函數的應用
function 函數名(){ } or 函數名(){ } 函數調用: 函數名 函數名 參數1 參數2
下面是一個小例子程序:
1 #!/bin/bash 2 #fun.sh 3 function add(){ 4 echo $(($1+$2)) 5 } 6 add 20 30 7 add 20 90