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