歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell語法使用

shell語法使用

日期:2017/3/1 15:28:45   编辑:SHELL編程
shell語法使用   這兩天初次接觸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
Copyright © Linux教程網 All Rights Reserved