Linux Shell腳本編寫規範、例子

1、規範java

Linux的Shell種類衆多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不一樣的Shell語言的語法有所不一樣,因此不能交換使用。每種Shell都有其特點之處,基本上,掌握其中任何一種 就足夠了。在本文中,咱們關注的重點是Bash,也就是Bourne Again Shell,因爲易用和免費,Bash在平常工做中被普遍使用;同時,Bash也是大多數Linux系統默認的Shell。在通常狀況下,人們並不區分 Bourne Shell和Bourne Again Shell,因此,在下面的文字中,咱們能夠看到#!/bin/sh,它一樣也能夠改成#!/bin/bash。mysql

利用vi等文本編輯器編寫Shell腳本的格式是固定的,以下:sql

#!/bin/shshell

#comments數據庫

Your commands go here編程

首行中的符號#!告訴系統其後路徑所指定的程序便是解釋此腳本文件的Shell程 序。若是首行沒有這句話,在執行腳本文件的時候,將會出現錯誤。後續的部分就是主程序,Shell腳本像高級語言同樣,也有變量賦值,也有控制語句。除第 一行外,以#開頭的行就是註釋行,直到此行的結束。若是一行未完成,能夠在行尾加上",這個符號代表下一行與此行會合併爲同一行。bash

編輯完畢,將腳本存盤爲filename.sh,文件名後綴sh代表這是一個Bash腳本文件。執行腳本的時候,要先將腳本文件的屬性改成可執行的:oracle

chmod +x filename.shless

執行腳本的方法是:編程語言

./filename.sh

2、Shell的基本知識

與其餘語言不一樣,Shell Script中if語句的條件部分要以分號來分隔。第三行中的[]表示條件測試,經常使用的條件測試有下面幾種:

[ -f "$file" ] 判斷$file是不是一個文件

[ $a -lt 3 ] 判斷$a的值是否小於3,一樣-gt和-le分別表示大於或小於等於

[ -x "$file" ] 判斷$file是否存在且有可執行權限,一樣-r測試文件可讀性

[ -n "$a" ] 判斷變量$a是否有值,測試空串用-z

[ "$a" = "$b" ] 判斷$a和$b的取值是否相等

[ cond1 -a cond2 ] 判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立

要注意條件測試部分中的空格。在方括號的兩側都有空格,在-f、-lt、=等符號兩側一樣也有空格。若是沒有這些空格,Shell解釋腳本的時候就會出錯。

 

      Linux中bash shell語音保留的關鍵字:

case

elif

let

clear

else

read

continue

if

then

echo

for in

while

 

 

2.1. shell提示符及其環境

提示符:$

環境:Linux,Unix,Dos等等

? Shell其實就是一個解釋執行命令的程序,所謂shell編程其實就是用必定的語法將各類基本的命令組合起來,讓shell程序去解釋執行。

同傳統的編程語言同樣,shell提供了不少特性,這些特性可使你的shell script編程更爲有用,如:數據變量、參數傳遞、判斷、流程控制、數據輸入和輸出,子程序及以中斷處理等。

2.2 如何執行shell程序

Shell程序(***.sh)

? 執行這個命令時

(1) #./***.sh

(2) #chmod u+x ***.sh

#***.sh

(3) #sh ***.sh

2.3 常量

? 字符串,例如「Hello World!」。

? 數字,例如705,23。

 

2.4 變量

shell編程中它們是沒有類型的,簡稱弱類型編程語言,在這個變量中能夠保含一個數字,一個字符串,一個單詞等。你並不須要聲明這個變量,它會在引用這個變量時建立它。

STR="Hello World!"

echo $STR

  HOME="/home"                //注意賦值不要有空格

  a=123

  HOME_LIST=$(ls /home) //把命令的執行結果賦值給變量

  ehco $HOME                   //$ 符號是得到變量HOME的值

  a=a+1

系統變量:

  $0 這個程序的執行名字

  $n  這個程序的第n個參數值,n=1...9

  $*  這個程序的全部參數

  $# 這個程序的參數個數

  $$ 這個程序的PID

  $! 執行上一個背景指令的PID

     $? 上一個指令的返回值

2.5 局部變量

      局部變量通常是指寫在函數中的變量,他的生命力是有限的。局部變量比較好理解,這裏就再也不多介紹了。

2.6 從鍵盤輸入變量值

使用read命令

read var1 var2 … varn

2.7 註釋

?Shell編程中的註釋以#開頭

2.8 數字運算

主要是指整數運算。expr命令能夠將字符型變量轉換爲整數進行操做

語法:expr integer operator integer

其中operator爲+ - * / %, 但對*的使用要用轉義符/,如:

[oracle@localhost ~]$ more dvd.sh

#!/bin/bash

expr 5 /* 5

[oracle@localhost ~]$ sh dvd.sh

25

2.9 邏輯運算

test進行邏輯運算,用[ ]括起來就是test運算

int1 -eq int2 相等?

int1 -ne int2 不等?

int1 -gt int2 int1 > int2 ?

int1 -ge int2 int1 >= int2 ?

int1 -lt int2 int1 < int2 ?

int1 -le int2 int1 <= int2

2.10 雙引號及單引號

?$echo "$HOME $PATH"  -- 顯示變量值

/home/hbwork opt/kde/bin:/usr/local/bin:

 $echo '$HOME $PATH'  -- 顯示單引號裏的內容

$HOME $PATH

2.11 空格

因爲shell對命令中的多餘的空格不做任何處理 ,而用引號括起來則能夠防止shell去掉這些空格。

$ str1=abcd

$ str2="abcd "

2.12 分支結構

2.12.1 結構一

if [ variable = value ]

then

command

else

if [ variable = value ]

then

command

else

command

fi

2.12.2 結構二

if [ variable = value ]

then

command

elif [ variable = value ]

then

command

fi

if 語句示例:

if [ "22" -lt "33" ]   then   //注意空格

  echo "22 less than 33"

  else

  echo "no"

fi                                  //if語句的結束

2.13 Case語句

case value in

pattern1)

command;;

pattern2)

command;;

...

patternn)

command;

esac

 

case 示例:

 

  echo "enter a number"

  read ans                    //讀取一個變量read

  case $ans in

  1)

  echo   "you numer is $ans"

  ;;                                //注意符號是兩個 ;

  2)

  echo "you number is 2"

  ;;

  [3-9])

  echo "you number is $ans"

  ;;

  *)                                   //*通配符

  echo "others"

esac

 

2.14 And 和 Or

command1 && command2

? command1 || command2

 

2.15 循環語句

2.15.1 For循環

for var in arg1 arg2 ... argn

do

command

....

command

done

 

 

For循環示例

int=1

for $int in 1 2 3 4 5

do

sq=`expr $int /* $int`

echo $sq

int=`expr $int + 1`

done

 

2.15.2 while循環

 

while command

do

command

command

command

...

Done

While循環的示例

int=1

while [ $int -le 5 ]

do

sq=`expr $int /* $int`

echo $sq

int=`expr $int + 1`

done

2.15.3 until循環結構

until command

do

command

command

....

command

done

 

Until循環示例

? int=1

until [ $int -gt 5 ]

do

sq=`expr $int /* $int`

echo $sq

int=`expr $int + 1`

done

 

2.16 從循環中退出: break和continue命令

break 當即退出循環

continue 忽略本循環中的其餘命令,繼續下一下循環

 

2.17 函數 (子過程)

funcname()

{

command

...

command; #分號

}

 

 

函數示例

setup ()

{ command list ; }

do_data ()

{ command list ; }

setup

do_data

 

2.18  shell程序的調試

? 使用-x進行跟蹤執行,執行並顯示每一條指令。

 

 

2.19 比較運算符

 

2.19.1 文件比較運算符

  -e filename        若是 filename 存在,則爲真            [ -e /var/log/syslog ]

  -d filename       若是 filename 爲目錄,則爲真       [ -d /tmp/mydir ]

  -f filename        若是 filename 爲常規文件,則爲真 [ -f /usr/bin/grep ]

  -L filename        若是 filename 爲符號連接,則爲真   [ -L /usr/bin/grep ]

  -r filename          若是 filename 可讀,則爲真              [ -r /var/log/syslog ]

  -w filename        若是 filename 可寫,則爲真            [ -w /var/mytmp.txt ]

  -x filename         若是 filename 可執行,則爲真           [ -L /usr/bin/grep ]

 

  filename1 -nt filename2 若是 filename1 比 filename2 新,則爲真 [ /tmp/install/etc/services -nt /etc/services ]

  filename1 -ot filename2 若是 filename1 比 filename2 舊,則爲真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

 

2.19.2 字符串比較運算符 (請注意引號的使用,這是防止空格擾亂代碼的好方法)

  -z string               若是 string 長度爲零,則爲真          [ -z "$myvar" ]

  -n string              若是 string 長度非零,則爲真               [ -n "$myvar" ]

  string1 = string2 若是 string1 與 string2 相同,則爲真 [ "$myvar" = "one two three" ]

  string1 != string2 若是 string1 與 string2 不一樣,則爲真 [ "$myvar" != "one two three" ]

  

2.19.3 算術比較運算符

  num1 -eq num2                 等於                            [ 3 -eq $mynum ]

  num1 -ne num2                不等於                         [ 3 -ne $mynum ]

  num1 -lt num2                    小於                            [ 3 -lt $mynum ]

  num1 -le num2              小於或等於                       [ 3 -le $mynum ]

  num1 -gt num2                    大於                            [ 3 -gt $mynum ]

  num1 -ge num2               大於或等於                     [ 3 -ge $mynum ]

 

3、實例

#/bin/sh
filename=`date +%Y%m%d%H%I%M`
mysqldump -uroot -p560e25cafb test>/home/mysql/test$filename.sql   //備份數據庫

#/bin/sh
echo "this is mailtest" | mail -s "hello" 42975647xx@qq.com  //發送郵件

 

四. Shell 的一些注意事項

 

3.1. 基礎

  #!/bin/bash   //bash腳本第一句都是這個,他會讓系統指定以bash來解釋這個腳本

#                 //shell腳本註釋符號

 

3.2. 變量

變量賦值的時候"="兩邊的內容要緊靠"="

例如:sum=0,寫java寫的時間長了總喜歡寫成sum = 0,可是這樣的結果是編輯器不識別

3.3. 在使用if、while時,在注意變量與符號之間的分割

例如:if [ `expr $a % 3` -ne 0 ],while [ "$var" != "end" ],儘可能分開寫,這樣也挺好看也便於識別。

 

3.4.  let的意思是讓"="後面的內容作算術運算,例如:let x=a-b

 

3.5. 大多數狀況下,可使用測試命令來對條件進行測試,好比能夠比較字符串、判斷文件是否存在及是否可讀等等……一般用" [ ] "來表示條件測試,注意這裏的空格很重要,要確保方括號先後的空格。

 

[ -f "somefile" ] :判斷是不是一個文件

[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行權限

[ -n "$var" ] :判斷$var變量是否有值

[ "$a" = "$b" ] :判斷$a和$b是否相等

 

3.6 幾個簡單例子

  for filename in $(ls)

  do

  cat $filename

  done

 

 

  for((i=0; i<10; i++))

  do

  echo $i

  done

 

  x=1

  sum=0

  while [ $x -le 10 ]  //注意[ ] 兩邊的空格

  do

  let sum=sum+$x   //shell中算術計算使用let

  let x=x+1

  done

  echo $sum

相關文章
相關標籤/搜索