shell入門基礎必備(轉)

gugu99發表於2007-08-10
shell入門基礎必備(轉)[@more@]

  1.建立和執行shell程式

  什麼是shell程式呢? 簡單的說shell程式就是一個包含若干行

  shell或者linux命令的檔案.

  象編寫高階語言的程式一樣,編寫一個shell程式需要一個文字編輯器.如VI等.

  在文字編輯環境下,依據shell的語法規則,輸入一些shell/linux命令列,形成一個完整

  的程式檔案.

  執行shell程式檔案有三種方法

  (1)#chmod +x file(在/etc/profile中,加入export PATH=${PATH}:~/yourpath,就可以在命令列下直接執行,像執行普通命令一樣)

  (2)#sh file

  (3)# . file

  (4)#source file

  在編寫shell時,第一行一定要指明系統需要那種shell解釋你的shell程式,如:#! /bin/bash,

  #! /bin/csh,/bin/tcsh,還是#! /bin/pdksh .

  2.shell中的變數

  (1)常用系統變數

  $ #    :儲存程式命令列引數的數目

  $ ?    :儲存前一個命令的返回碼

  $ 0    :儲存程式名

  $ *    :以("$1 $2...")的形式儲存所有輸入的命令列引數

  $ @    :以("$1""$2"...)的形式儲存所有輸入的命令列引數

  (2)定義變數

  shell語言是非型別的解釋型語言,不象用C++/JAVA語言程式設計時需要事先宣告變數.給一

  個變數賦值,實際上就是定義了變數.

  在linux支援的所有shell中,都可以用賦值符號(=)為變數賦值.

  如:

  abc=9 (bash/pdksh不能在等號兩側留下空格 )

  set abc = 9 (tcsh/csh)

  由於shell程式的變數是無型別的,所以使用者可以使用同一個變數時而存放字元時而存放

  整數.

  如:

  name=abc (bash/pdksh)

  set name = abc (tcsh)

  在變數賦值之後,只需在變數前面加一個$去引用.

  如:

  echo $abc

  (3)位置變數

  當執行一個支援多個命令列引數的shell程式時,這些變數的值將分別存放在位置變數裡.

  其中第一個引數存放在位置變數1,第二個引數存放在位置變數2,依次類推...,shell保留

  這些變數,不允許使用者以令外的方式定義他們.同別的變數,用$符號引用他們.

  3.shell中引號的使用方法

  shell使用引號(單引號/雙引號)和反斜線("")用於向shell直譯器遮蔽一些特殊字元.

  反引號(")對shell則有特殊意義.

  如:

  abc="how are you" (bash/pdksh)

  set abc = "how are you" (tcsh)

  這個命令列把三個單片語成的字串how are you作為一個整體賦值給變數abc.

   abc1='@LOGNAME,how are you!' (bash/pdksh)

 

  (3)用於檔案操作的運算子,他們能檢查:檔案是否存在,檔案型別等

   test表示式  |  含義

 

  5.條件語句

  同其他高階語言程式一樣,複雜的shell程式中經常使用到分支和迴圈控制結構,

  bash,pdksh和tcsh分別都有兩種不同形式的條件語句:if語句和case語句.

  (1)if語句

  語法格式:

  bash/pdksh用法:

  if [expression1]

  then

  commands1

  elif [expression2]

  commands2

  else

  commands3

  if

  tcsh用法:

  if (expression1) then

commands1

else if (expression2) then

commands2

else

commands3

endif

  含義:當expression1的條件為True時,shell執行then後面的commands1命令;當

  expression1的條件為false並且expression2的條件滿足為True時,shell執行

  commands2命令;當expression1和expressin2的條件值同為false時,shell執行

  commands3命令.if語句以他的反寫fi結尾.

  (2)case語句

  case語句要求shell將一個字串S與一組字串模式P1,P2,...,Pn比較,當S與

  某個模式Pi想匹配時,就執行相應的那一部分程式/命令.shell的case語句中字元

  模式裡可以包含象*這樣的萬用字元.

  語法格式:

  bash/pdksh用法:

  case string1 in

str1)

commands1;;

str2)

commands2;;

*)

commands3;;

esac

tcsh用法:

switch (string1)

case str1:

statements1

breaksw

case str2:

statements2

breaksw

default:

statements3

breaksw

endsw

  含義:shell將字串string1分別和字串模式str1和str2比較.如果string1與str1匹配,則

  shell執行commands1的命令/語句;如果string11和str2匹配,則shell執行commands2的命令/

  語句.否則shell將執行commands3的那段程式/命令.其中,每個分支的程式/命令都要以兩個

  分號(;;)結束.

  6.迴圈語句

  當需要重複的某些操作時,就要用到迴圈語句.

  (1)for語句

  大家知道在很多程式語言中for語句是最常見.在shell中也不例外.for語句要求shell將包含

  在這個語句中的一組命令連續執行一定的次數.

  語法格式:

  bash/pdksh

  用法1:

  for var1 in list

  do

  commands

  done

  含義:在這個for語句中,對應於list中的每個值,shell將執行一次commands代表的一組命令.

  在整個迴圈的每一次執行中,變數var1將依此取list中的不同的值.

  用法2:

  for var1

  do

  setatements

  done

  含義:在這個for語句中,shell針對變數var1中的每一項分別執行一次statements代表的一組

  命令.當使用這種形式的語句時,shell認為var1變數中包含了所有的位置變數,而位置變數中

  存放著程式的命令列引數值.也就是說,他等價於下列形式:

  for var1 in " $@"

  do

  statements

  done

  tcsh用法:

  在tcsh中沒有for這個單詞,與for語句起同樣功能的是foreach語句

  foreach name (list)

  commands

  end

  舉例:

  for file            ;bash/pdksh

do

tr a-z A-Zfile.caps

done

#               ;tcsh

foreach file ( $ * )

tr a-z A-Z$file.caps

end

  (2)while語句

  while語句是shell提供的另一種迴圈語句. while語句指定一個表示式和一組命令.這個

  語句使得shell重複執行一組命令,直到表示式的值為False為止.

  語法格式:

  while expression   ;bash

do

statements

done

while (expression)  ;tcsh

statements

end

  舉例:

  count=1       ;bash

while [ -n "$ *"]  ***

do

echo "this is a parameter number $count $1"

shift

count='expr $count + 1'

done

set count = 1     ;tcsh

while ( " $ * " ! = "")

echo "this is a parameter number $count $1"

shift

set count = 'expr $count + 1'

end

  語句中shift命令的功能是將所有的命令列引數依次相左傳遞.

  (3)until語句

  until與while語句具有類似的語法格式和功能,不同的是while中expression的值為True時,

  shell執行命令組;而until中當expression的值為False時,shell才執行那組命令.

  語法格式:

  until expression

do

commands

done

  舉例:

  count=1

until [ -z " $ * "]    ***

echo "this is a parameter number $count $1"

shift

count='expr $count + 1'

done

  情注意上述例子中帶***號.在while中的表示式: -n string,他的含義是當string不是空

  字串時,表示式的值為True;在until中的表示式: -z string,他的 含義是當string是空

  字串時,表示式的值為True.由此可見,兩個程式對條件表示式的設定恰好是相反的.

  (4)shift語句

  bash和tcsh都支援shift命令.shift將存放在位置變數中的命令列引數,依次向左傳遞.例如

  位置變數當前值為:

  $1=file1 $2=file2 $3=file3

  執行一次shift命令後,位置變數的值為:

  $1=file2 $2=file3

  還可以在shift命令中指定位置變數轉移的次數, 如:

  shift n

  例子:

  while [ "$1"]

do

if [ "$1"="-i"] then

infile=" $2"

shift 2

else if [ "$1"="-o"] then

outfile="$2"

shift 2

else

echo "Program $0 does not recognize option $1"

fi

done

tr a-z A-Z$outfile

  (5)select語句

  select語句是pdksh提供的一個獨特的迴圈語句.他不同於前面介紹的迴圈語句.他不是

  反覆計算一個條件表示式,並依據表示式的值決定是否執行一組命令.select的功能是自動的

  生成一個簡單的文字選單.

  語法格式:

  select menu [in list_of_items]

do

commands

done

  含義:當執行一個select語句時,pdksh分別為每個列在list_of_items中的成員建立一個選單

  選項.list_of_items既可以是一個包含多個選項的變數,也可以是直接列在程式中的一組選項

  .如果語句中沒有提供list_of_items,select語句將使用位置變數作為list_of_items.

  舉例:

  select menuitem in pick1 pick2 pick3

do

echo "are you sure you want to pick $menuitem"

read res          ;接收使用者的輸入,並且將輸入的值存放在特定變數裡.

if [ $res=" y" -o $res=" Y"]

then

break           ;用於退出while,for,select等迴圈語句

fi

done

  (6)repeat語句

  repeat語句是tcsh提供的獨有的迴圈語句.使用repeat命令要求shell對一個命令執行一定

  的次數.

  語法格式:

  repeat count command

  如;

  foreach num ( $ *)

repeat $num echo -n " *"

echo " "

end

  7.shell中的函式

  shell允許使用者定義自己的函式.函式是高階語言中的重要結構.shell中的函式於C或者其他

  語言中定義的函式一樣.與從頭開始,一行一行地寫程式相比,使用函式主要好處是有利於組織

  整個程式.在bash中,一個函式的語法格式如下:

  fname (){

shell comands

}

  定義好函式後,需要在程式中呼叫他們.bash中呼叫函式的格式:

  fname [parm1 parm2 parm3...]

  呼叫函式時,可以向函式傳遞任意多個引數.函式將這些引數看做是存放他的命令列引數的

  位置變數.

  舉例:

  這個程式定義了4個函式:

  upper ():將傳遞給他的檔案中的字母轉換成大寫,並存放到同名的結尾為.out的檔案中.

  lower ():將傳遞給他的檔案裡的字母轉換成小寫,並存放到同名的結尾為.out的檔案中.

  print ():輸出傳遞給他的檔案的內容.

  usage_error ():輸出程式的幫助資訊.

  程式的主模組是個case條件語句,他根據命令列中第一個引數,決定程式要完成的功能,並呼叫相應

  的函式完成這一功能.

  upper (){

shift

for i

do

tr a-a A-Z$1.out

rm $1

mv $1.out $1

shift

done; }

lower () {

shift

for i

do

tr A-Z a-z$1.out

rm $1

mv $1.out $1

shift

done; }

print() {

shift

for i

do

lpr $1

shift

done; }

usage_error() {

echo " $1 syntax is $1

  總結

  利用shell程式設計是提高系統管理工作效率的重要手段,學好shell跟了解系統基本命令和管理

  工具的使用方法同樣重要!

  附:

  A.bash中常用的命令

  命令   |  含義

-------------------------------------------------------------------------------

Alias   |設定命令別名

Bg    |將一個被掛起的程式在後臺執行

cd    |改變使用者的當前目錄

exit   |終止一個shell

export  |使作為這個命令的引數的變數及其當前值,在當前執行的shell的子程式中可見

fc    |編輯當前的命令列歷史列表

fg    |讓一個被掛起的程式在前臺執行

help   |顯示bash內部命令的幫助資訊

history  |顯示最近輸入的一定數量的命令列

kill   |終止一個程式

pwd    |顯示使用者當前工作目錄

unalias  |刪除命令列別名

--------------------------------------------------------------------------------

  B.bash中常用的系統變數

  變數     |  含義

-------------------------------------------------------------------------------

EDITOR,FCEDIT |Bash的fc命令的預設文字編輯器

HISTFILE   |規定存放最近輸入命令列檔案的名字

HISTSIZE   |規定命令列歷史檔案的大小

HOME     |當前使用者的宿主目錄

OLDPWD    |使用者使用的前一個目錄

PATH     |規定bash尋找可執行檔案時搜尋的路徑

PS1      |命令列環境中顯示第一級提示符號

PS2      |命令列環境中顯示第二級提示符號

PWD      |使用者當前工作目錄

SECONDS    |當前執行的bash程式的執行時間(以秒為單位)

--------------------------------------------------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-939774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章