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

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM