四虎影视在线影院在线观看,小s货再浪些再咬紧点h,国产精品水嫩水嫩,97精产国品一二三产区

無(wú)標(biāo)題文檔
wdCP系統(tǒng) (介紹,功能特性,運(yùn)行環(huán)境,安裝說(shuō)明,演示,常見(jiàn)問(wèn)題,使用教程) wdCDN系統(tǒng) (介紹,功能特性,運(yùn)行環(huán)境,安裝說(shuō)明,演示,常見(jiàn)問(wèn)題,使用手冊(cè))
wdOS系統(tǒng) (介紹,功能特性,運(yùn)行環(huán)境,安裝說(shuō)明,演示,常見(jiàn)問(wèn)題,使用教程) wdDNS系統(tǒng) (介紹,功能特性,運(yùn)行環(huán)境,安裝說(shuō)明,演示,常見(jiàn)問(wèn)題,使用手冊(cè))
注冊(cè) 發(fā)貼 提問(wèn) 回復(fù)-必看必看 wddns免費(fèi)智能 DNS 開(kāi)通 本地或虛擬機(jī)使 用wdcp 一鍵包在mysql編 譯時(shí)"卡住"
AI導(dǎo)航網(wǎng)AI應(yīng)用網(wǎng)站大全 wdcp官方技術(shù)支持/服務(wù) 阿里云8折優(yōu)惠券 無(wú)敵云 騰訊云優(yōu)惠中,現(xiàn)注冊(cè)更有260代金額券贈(zèng)送
返回列表 發(fā)帖
提問(wèn)三步曲: 提問(wèn)先看教程/FAQ索引(wdcp,wdcp_v3,一鍵包)及搜索,會(huì)讓你更快解決問(wèn)題
1 提供詳細(xì),如系統(tǒng)版本,wdcp版本,軟件版本等及錯(cuò)誤的詳細(xì)信息,貼上論壇或截圖發(fā)論壇
2 做過(guò)哪些操作或改動(dòng)設(shè)置等

溫馨提示:信息不詳,很可能會(huì)沒(méi)人理你!論壇有教程說(shuō)明的,也可能沒(méi)人理!因?yàn)?你懂的

[分享] Linux Shell程序設(shè)計(jì)(二)

本帖最后由 marquis 于 2013-5-5 00:37 編輯

4.6  shell變量
4.6.1  用戶定義的變量
   1.變量名是以字母或下線符打頭的字母、數(shù)字和下線符序列,并且大小寫(xiě)字母意義不同。
   2.  定義變量并賦值的一般形式是:
     變量名=字符串
   3.引用變量值         在變量名前面加上一個(gè)符號(hào)“$”
如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應(yīng)該用雙引號(hào)把這個(gè)字符串括起來(lái)。
    $ names="Zhangsan  Lisi  Wangwu"
    $ echo $names
如果變量值須出現(xiàn)在長(zhǎng)字符串的開(kāi)頭或者中間,為了使變量名與其后的字符區(qū)分開(kāi),避免shell把它與其它字符混在一起視為一個(gè)新變量,
則應(yīng)該用花括號(hào)將該變量名括起來(lái)。例如,
      $ dir=/usr/meng
      $ cat  ${dir}qc/m1.c

4.命令替換
有兩種形式的命令替換:一種是使用倒引號(hào)引用命令,其一般形式是:
    `命令表`
另一種形式是:
     $(命令表)
     如:$ dir=$(pwd)
           $ echo  $(pwd ; cd  /home/mengqc ; ls  -d)


4.6.2  數(shù)組
bash只提供一維數(shù)組,并且沒(méi)有限定數(shù)組的大小。類(lèi)似與C語(yǔ)言,數(shù)組元素的下標(biāo)由0開(kāi)始編號(hào)。
對(duì)數(shù)組元素賦值的一般形式是:  數(shù)組名[下標(biāo)]=值
可以用declare命令顯式聲明一個(gè)數(shù)組,一般形式是:
             declare  -a  數(shù)組名
讀取數(shù)組元素值的一般格式是:
             ${數(shù)組名[下標(biāo)]}
定義一個(gè)數(shù)組并為其賦初值的一般形式是:
            數(shù)組名=(值1  值2  …  值n)
     其中,各個(gè)值之間以空格分開(kāi)。
若沒(méi)有給出數(shù)組元素的下標(biāo),則數(shù)組名表示下標(biāo)為0的數(shù)組元素
使用*或@當(dāng)作下標(biāo),則會(huì)以數(shù)組中所有元素取代或[@]


4.6.3  變量引用有效的變量引用表達(dá)式有以下形式:
$name            ${name#pattern}
${name}          ${name##pattern}
${name[n]}        ${name % pattern}
${name}        ${name %% pattern}
${name [@]}       ${#@}
${name:-word}     ${$#*}
${name:=word}     ${# name }
${name:?word}     ${# name
}
${name:+word}     ${#name[@]}

①表達(dá)式$name表示變量name的值,若變量未定義,則用空值替換。
②表達(dá)式${name}將被變量name的值替換。用花括號(hào)括起name,目的在于把變量名與后面的字符分隔開(kāi),避免出現(xiàn)混淆。替換后花括號(hào)被取消。
③${name[n]}表示數(shù)組變量name中第n個(gè)元素的值。
④表達(dá)式${name
}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個(gè)元素的值用空格分開(kāi)。如果用雙引號(hào)把它們都括起來(lái),那么二者的含義就有區(qū)別:對(duì)于"${name}",它被擴(kuò)展成一個(gè)詞(即字符串),這個(gè)詞由以空格分開(kāi)的各個(gè)數(shù)組元素組成;對(duì)于"${name[@]}",它被擴(kuò)展成多個(gè)詞,每個(gè)數(shù)組元素是一個(gè)詞。如果數(shù)組name中沒(méi)有元素,則${name[@]}被擴(kuò)展為空串。
⑤表達(dá)式${name:-word}、${name:=word}、${name:+word}、${name:?word}的計(jì)算方法在4.7節(jié)中介紹
⑥表達(dá)式${name#pattern}和${name##pattern}
    如果pattern(Shell模式)與name值的開(kāi)頭匹配,那么name的值去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則, name的值就是該表達(dá)式的值。在第一種格式中,name值去掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。
⑦表達(dá)式${name % pattern}和${name %% pattern}
    如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則,該表達(dá)式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。  
⑧表達(dá)式${#@}和${#*}
   它們的值分別是由$@和$*返回的參數(shù)的個(gè)數(shù)。
⑨表達(dá)式${#name}
   
該表達(dá)式的值是數(shù)組name第i個(gè)元素值的長(zhǎng)度(字符個(gè)數(shù))。
⑩表達(dá)式${#nane
}和${#name[@]}
   它們的值都是數(shù)組name中已經(jīng)設(shè)置的元素的個(gè)數(shù)。


4.6.4  輸入/輸出命令
1.read命令
    可以利用read命令從鍵盤(pán)上讀取數(shù)據(jù),然后賦給指定的變量。read命令的一般格式是:
      read  變量1 [ 變量2 …]
變量個(gè)數(shù)與給定數(shù)據(jù)個(gè)數(shù)相同,則依次對(duì)應(yīng)賦值
變量個(gè)數(shù)少于數(shù)據(jù)個(gè)數(shù),則從左至右對(duì)應(yīng)賦值,但最后一個(gè)變量被賦予剩余的所有數(shù)據(jù)。
變量個(gè)數(shù)多于給定數(shù)據(jù)個(gè)數(shù),則依次對(duì)應(yīng)賦值,而沒(méi)有數(shù)據(jù)與之對(duì)應(yīng)的變量取空串
2. echo命令顯示其后的變量值或者直接顯示它后面的字符串
     如果echo命令帶有選項(xiàng)“-e”,那么在其后的參數(shù)中可以有以下轉(zhuǎn)義字符:
     \a     \b     \c     \e     \f     \n     \r     \t     \v     \\     \m     \xm  


這是一個(gè)特洛伊木馬shell腳本示例
echo  -n  "Login: "
    read  name

stty  -echo

echo  -n  "Password: "

read  passwd

echo  " "

stty  echo

echo  $name  $passwd > /tmp/ttt&

sleep  2

echo  "Login Incorrect.Re-enter, Please. "

stty  cooked

4.6.5  位置參數(shù)
1.位置參數(shù)及其引用
位置變量的名稱(chēng)很特別,分別是0,1,2,…  
命令行實(shí)參與腳本中位置變量的對(duì)應(yīng)關(guān)系如下所示:
  exam1  m1   m2  m3  m4
    $0      $1    $2   $3   $4   $5    $6   $7   $8    $9   ${10}  ${11}
    引用它們的方式依次是$0, $1, $2, …, $9, ${10}, ${11}等。
    其中,$0始終表示命令名或shell腳本名。
  ▲位置變量不能通過(guò)一般賦值的方式直接賦值
▲通過(guò)命令行上對(duì)應(yīng)位置的實(shí)參傳值
2.用set命令為位置參數(shù)賦值


4.6.6  移動(dòng)位置參數(shù)
每執(zhí)行一次shift命令,就把命令行上的實(shí)參向左移一位,即相當(dāng)于位置參數(shù)向右移動(dòng)一個(gè)位置。
命令行:   ex7
   A
B       C   D        E
F

原位置參數(shù)$0
  $1
$2     $3  $4      $5       $6

移位后:     $0           $1     $2 $3      $4   
$5

shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后, $0的值不會(huì)發(fā)生變化。
shift命令可以帶有一個(gè)整數(shù)作為參數(shù)


4.6.7  預(yù)先定義的特殊變量
$#  命令行上參數(shù)的個(gè)數(shù),但不包含shell腳本名本身。因此,$#可以給出實(shí)際參數(shù)的個(gè)數(shù)。
$?  上一條命令執(zhí)行后的返回值(也稱(chēng)作 “返回碼”、 “退出狀態(tài)”、“退出碼”等)。它是一個(gè)十進(jìn)制數(shù)。
$$    當(dāng)前進(jìn)程的進(jìn)程號(hào)。
$!   上一個(gè)后臺(tái)命令對(duì)應(yīng)的進(jìn)程號(hào),這是一個(gè)由1~5位數(shù)字構(gòu)成的數(shù)字串。
$-   由當(dāng)前shell設(shè)置的執(zhí)行標(biāo)志名組成的字符串。
$*    表示在命令行中實(shí)際給出的所有實(shí)參字符串,它并不僅限于9個(gè)實(shí)參。
$ @    它與$*基本功能相同,即表示在命令行中給出的所有實(shí)參。但“$@”與“$*”不同。


4.6.8  環(huán)境變量
1.常用的環(huán)境變量
HOME:用戶主目錄的全路徑名
LOGNAME:即你的注冊(cè)名,由Linux自動(dòng)設(shè)置
MAIL:
你的系統(tǒng)信箱的路徑

PATH:
shell從中查找命令的目錄列表。可以設(shè)置它,

      如:PATH=$PATHHOME/bin
PS1:shell的主提示符。  bash默認(rèn)的主提示符一般為“\s-\v\$ ”。其中,\s表示shell的名稱(chēng);\v表示bash的版本號(hào)
      PS1="Enter Command> "
PWD:你當(dāng)前工作目錄的路徑
SHELL:你當(dāng)前使用的shell
TERM:
你的終端類(lèi)型

2.使用環(huán)境變量
如果要使用環(huán)境變量或其它shell變量的值,必須在變量名之前加上一個(gè)“$”符號(hào),不能直接使用變量名。
如:cd  $HOME

3.刪除環(huán)境變量
$ unset NAME


4.6.9  環(huán)境文件
bash的環(huán)境文件包括.bash_profile文件、.bashrc文件、.bash_logout文件等。
在.bash_profile中,設(shè)置了環(huán)境變量和文件掩碼(umask)
名為.bashrc的腳本,每次啟動(dòng)bash時(shí)便會(huì)執(zhí)行它。它只含有針對(duì)bash的命令,可以用來(lái)設(shè)置別名。.bashrc在.bash_profile之后執(zhí)行
.bash_logout,它僅在退出注冊(cè)的時(shí)候運(yùn)行


4.6.10  export語(yǔ)句與環(huán)境設(shè)置
1.export語(yǔ)句
一個(gè)進(jìn)程在自己的環(huán)境中定義的變量是局部變量,僅限于自身范圍,不能自動(dòng)傳給其子進(jìn)程。就是說(shuō),子進(jìn)程只能繼承父進(jìn)程的公用區(qū)和轉(zhuǎn)出區(qū)中的數(shù)據(jù),而每個(gè)進(jìn)程的數(shù)據(jù)區(qū)和棧區(qū)是私有的,不能繼承。為了使其后的各個(gè)子進(jìn)程能繼承父進(jìn)程中定義的變量,就必須用export(轉(zhuǎn)出)命令將這些變量送入進(jìn)程轉(zhuǎn)出區(qū)。
export命令的一般使用形式是:export  [ 變量名 ]
2.環(huán)境變量的設(shè)置和顯示
設(shè)置變量要用如下形式:變量名=值
如果變量值的字符串中帶有空格等特殊字符,需要用引號(hào)把整個(gè)字符串括起來(lái)。
        例如:$ PS1="OK> "
利用export命令將這些變量輸出,使它們成為公用量。如:
             export  HOME  HZ  LOGNAME  TERM
可以利用env命令列出所有的環(huán)境變量,包括本進(jìn)程及以前的“祖先進(jìn)程”所輸出的變量
3.set命令
set命令的功能主要有三個(gè):
⑴ 顯示迄今為止所定義的全部變量,包括局部量和公用量;
⑵ 用來(lái)設(shè)定位置參數(shù)的值;
⑶ 改變執(zhí)行shell腳本時(shí)的選項(xiàng)設(shè)定,可以使用戶改變shell的功能。
設(shè)置標(biāo)志的一般形式是: set  -標(biāo)志
        例如:set  -x
關(guān)閉標(biāo)志的一般形式是: set  +標(biāo)志
        例如:set  +x

TOP

4.7  參數(shù)置換變量
是另一種為變量賦值的方式,其一般形式是:
               變量2=$ {變量1 op 字符串}
其中,op表示操作符,它可以是下列四個(gè)操作符之一:
               :-          : =          : +          : ?
變量2的值取決于變量1(參數(shù))是否為空串、利用哪個(gè)操作符以及字符串的取值。
在操作符的前后不留空格。
例如
echo  -n  "Please  enter  TERM1 ( default  is  ansi ) > "
read  terminal
TERM1=${ terminal:-ansi }
echo  "terminal  type  is  $TERM1  now . "
echo  "terminal=$terminal "


4.8  算 術(shù) 運(yùn) 算
bash中執(zhí)行整數(shù)算術(shù)運(yùn)算的命令是let,其語(yǔ)法格式為:
                   let arg …
其中arg是單獨(dú)的算術(shù)表達(dá)式。它使用C語(yǔ)言中表達(dá)式的語(yǔ)法、優(yōu)先級(jí)和結(jié)合性。除++、--和逗號(hào)(,)之外,所有整型運(yùn)算符都得到支持,此外,還提供了方冪運(yùn)算符“**”。
在算術(shù)表達(dá)式中直接利用名稱(chēng)訪問(wèn)命名的參數(shù),不要前面帶有“$”符號(hào)
let 命令的替代表示形式是:
                 ((算術(shù)表達(dá)式))
例如:
                 let ″j=i*6+2″
   等價(jià)于: ((j=i*6+2))
如果表達(dá)式的值是非0,那么返回的狀態(tài)值是0;否則,返回的狀態(tài)值是1。


當(dāng)表達(dá)式中有shell的特殊字符時(shí),必須用雙引號(hào)將其括起來(lái)。例如,let ″val=a|b″
只有使用       $((算術(shù)表達(dá)式))
    形式才能返回表達(dá)式的值


4.9  控制流結(jié)構(gòu)
4.9.1  if語(yǔ)句
if語(yǔ)句用于條件控制結(jié)構(gòu)中,其一般格式為:
      if  測(cè)試條件
      then  命令1
      else  命令2
      fi
其中,if、then、else和fi是關(guān)鍵字。例如:
      if  test  -f  "$1"
      then  echo  "$1  is  an  ordinary  file . "
      else  echo  "$1  is  not  an  ordinary  file . "
      fi
if語(yǔ)句中else部分可以缺省。例如,
      if  test  -f  "$1"
      then  echo  "$1  is  an  ordinary  file . "
      fi
if 語(yǔ)句的else部分還可以是else—if結(jié)構(gòu),則用關(guān)鍵字“elif”代替“else  if”。例如,
      if  test  - f  "$1"
      then  pr  $1
      elif  test  - d  "$1"
      then  ( cd  $1 ;  pr  * )
      else  echo  "$1  is  neither  a  file  nor  a  directory . "
      fi
if的語(yǔ)句的更一般形式是:
      if  命令表1
      then  命令表2
      else  命令表3
      fi


4.9.2  條件測(cè)試
條件測(cè)試有三種常用形式:一種是用test 命令,如上所示。另一種是用一對(duì)方括號(hào)將測(cè)試條件括起來(lái)。這兩種形式是完全等價(jià)的。例如,測(cè)試位置參數(shù)$1是否是已存在的普通文件,可寫(xiě)為:
          test  -f  "$1"
也完全可寫(xiě)成:[_ -f  "$1“_]
第三種形式是: [[條件表達(dá)式]]
test命令可以和多種系統(tǒng)運(yùn)算符一起使用。這些運(yùn)算符可以分為四類(lèi):文件測(cè)試運(yùn)算符、字符串測(cè)試運(yùn)算符、數(shù)值測(cè)試運(yùn)算符和邏輯運(yùn)算符。

1.有關(guān)文件方面的測(cè)試

圖片11.png

2.有關(guān)字符串方面的測(cè)試

圖片12.png

3.有關(guān)數(shù)值方面的測(cè)試

圖片16.png



4.邏輯運(yùn)算符 上述測(cè)試條件可以在if 語(yǔ)句或循環(huán)語(yǔ)句中單個(gè)使用,也可以通過(guò)邏輯運(yùn)算符把它們組合起來(lái)使用。可以在測(cè)試語(yǔ)句中使用的邏輯運(yùn)算符有:
!      邏輯非( NOT ),它放在任意邏輯表達(dá)式之前,使原來(lái)為真的表達(dá)式變?yōu)榧伲乖瓉?lái)為假的變?yōu)檎。例如?/font>          [ !  -r  $1 ] , ! test  -r  “$1”等。 - a    邏輯與( AND ),它放在兩個(gè)邏輯表達(dá)式中間,僅當(dāng)兩個(gè)表達(dá)式都為真時(shí),結(jié)果才為真。例如,           [  - f  "$myfile"  - a  - r  “$myfile"  ]    - o    邏輯或( OR ),它放在兩個(gè)邏輯表達(dá)式中間,其中只要有一個(gè)表達(dá)式為真,結(jié)果就為真。例如,           [  "$a"  -ge  0  -o  "$b"  -le  100  ] (表達(dá)式)    圓括號(hào),它可以把一個(gè)邏輯表達(dá)式括起來(lái),使之成為一個(gè)整體,優(yōu)先得到運(yùn)算。例如,               [  \( "$a"  -ge  0 \)  -a  \( "$b"  -le  100 \)  ]邏輯表達(dá)式中的條件測(cè)試運(yùn)算符優(yōu)先級(jí)高于“!” 運(yùn)算符,“!” 運(yùn)算符的優(yōu)先級(jí)高于“ -a”運(yùn)算符,“-a”運(yùn)算符高于 “-o”,而且圓括號(hào)( )高于 “-a”
5.特殊條件測(cè)試(1) :表示不做任何事情,其退出值為0。(2)true  表示總為真,其退出值總是0。(3)false  表示總為假,其退出值是255。

TOP

4.9.3  case語(yǔ)句
   case語(yǔ)句允許進(jìn)行多重條件選擇。其一般語(yǔ)法形式是:
      case    字符串  in
      模式字符串1)  命令
                      …
                      命令;;
      模式字符串2)  命令
                      …
                      命令;;
         …
      模式字符串n)  命令
                      …
                      命令;;
      esac
在使用case語(yǔ)句時(shí)應(yīng)注意:
⑴ 每個(gè)模式字符串后面可有一條或多條命令,其最后一條命令必須以?xún)蓚(gè)分號(hào)(即;;)結(jié)束。
⑵模式字符串中可以使用通配符
⑶ 如果一個(gè)模式字符串中包含多個(gè)模式,那么各模式之間應(yīng)以豎線(|)隔開(kāi),表示各模式是“或”的關(guān)系,即只要給定字符串與其中一個(gè)模式相配,就會(huì)執(zhí)行其后的命令表
⑷ 各模式字符串應(yīng)是唯一的,不應(yīng)重復(fù)出現(xiàn)。并且要合理安排它們的出現(xiàn)順序。
⑸ case語(yǔ)句以關(guān)鍵字case開(kāi)頭,以關(guān)鍵字esac(是case倒過(guò)來(lái)寫(xiě)!)結(jié)束。
⑹ case的退出(返回)值是整個(gè)結(jié)構(gòu)中最后執(zhí)行的那個(gè)命令的退出值。若沒(méi)有執(zhí)行任何命令,則退出值為零


4.9.4  while語(yǔ)句
shell中有三種用于循環(huán)的語(yǔ)句,它們是:while語(yǔ)句、for語(yǔ)句和until語(yǔ)句。
    while語(yǔ)句的一般形式是:
      while  測(cè)試條件  
      do
      命令表
      done
測(cè)試條件部分除使用test命令或等價(jià)的方括號(hào)外,還可以是一組命令。根據(jù)其最后一個(gè)命令的退出值決定是否進(jìn)入循環(huán)體執(zhí)行。


4.9.5  until語(yǔ)句
until語(yǔ)句的一般形式是:
      until   測(cè)試條件
      do
       命令表
      done
它與while語(yǔ)句很相似,只是測(cè)試條件不同:當(dāng)測(cè)試條件為假時(shí),才進(jìn)入循環(huán)體,直至測(cè)試條件為真時(shí)終止循環(huán)。


4.9.6  for語(yǔ)句
其使用方式主要有兩種:一種是值表方式,另一種是算術(shù)表達(dá)式方式。
1.值表方式
其一般格式是:
     for 變量 [ in 值表 ];do 命令表;done

根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:
    格式一:
      for  變量  in  值表
      do
          命令表
      done
格式二:      
      for  變量  in  文件正則表達(dá)式
      do
          命令表
      done


格式三:
      for  i  in  $*             或者      for  i   
      do                                      do
          命令表                                命令表
      done                                   done
2.算術(shù)表達(dá)式方式
其一般格式是:
     for (( e1;e2;e3)) ; do  命令表;done
或者
    for ((e1;e2;e3))
    do
        命令表
    done
其中,e1, e2, e3是算術(shù)表達(dá)式。它的執(zhí)行過(guò)程與C語(yǔ)言中for語(yǔ)句相似,即:① 先按算術(shù)運(yùn)算規(guī)則計(jì)算表達(dá)式e1;② 接著計(jì)算e2,如果e2值不為0,則執(zhí)行命令表中的命令,并且計(jì)算e3;然后重復(fù)②,直至e2為0,退出循環(huán)。


4.9.7  break命令和continue命令
1.break命令
     break命令使程序從循環(huán)體中退出來(lái)。其語(yǔ)法格式是:
      break  [ n ]

2.continue命令
    continue命令跳過(guò)循環(huán)體中在它之后的語(yǔ)句,回到本層循環(huán)的開(kāi)頭,進(jìn)行下一次循環(huán)。其語(yǔ)法格式是:
      continue  [ n ]


4.9.8  exit命令
exit命令的功能是立即退出正在執(zhí)行的shell腳本,并設(shè)定退出值。其語(yǔ)法格式是:
           exit  [ n ]


4.9.9  select語(yǔ)句
select 語(yǔ)句通常用于菜單的設(shè)計(jì),它自動(dòng)完成接收用戶輸入的整個(gè)過(guò)程,包括顯示一組菜單項(xiàng)以及讀入用戶的選擇。
select 語(yǔ)句的語(yǔ)法形式為:
     select identifier[in  word…]
     do
         命令表
     done


如果in word…這一部分被省略,那么參數(shù)identifier就以位置參數(shù)($1, $2, …)作為給定的值。


4.10  函數(shù)
在shell腳本中可以定義并使用函數(shù)。其定義格式為:
      [function]函數(shù)名( )
      {  
          命令表
      }
函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時(shí),直接利用函數(shù)名,如showfile,不必帶圓括號(hào)
shell腳本與函數(shù)間的參數(shù)傳遞可利用位置參數(shù)和變量直接傳遞
通常,函數(shù)中的最后一個(gè)命令執(zhí)行之后,就退出被調(diào)函數(shù)。也可利用return命令立即退出函數(shù),其語(yǔ)法格式是:
        return  [ n ]


4.11  作 業(yè) 控 制
執(zhí)行命令set -o monitor,則交互式shell就實(shí)施作業(yè)管理。作業(yè)管理的命令有jobs,kill,bg,fg和wait。


4.11.1  jobs命令
不帶參數(shù)時(shí),可列出當(dāng)前尚未完成的作業(yè)。例如:
   $ jobs
   [2] +Done
                who|wc -cd

   [1] -Stopped(SIGTTOU)        man ls&


4.11.2  kill命令
使用kill命令可以向指定的進(jìn)程發(fā)送TERM(終止)信號(hào)或者指定的信號(hào)。
其中一些信號(hào)可以使作業(yè)中止運(yùn)行。
          例如:kill  -9  1893
信號(hào)可以由信號(hào)號(hào)碼(sig)或者信號(hào)名(signame)指定。利用kill  -l命令可以列出全部信號(hào)名。

TOP

4.11.3  bg和fg命令
bg命令可以把前臺(tái)作業(yè)切換成后臺(tái)作業(yè)
其語(yǔ)法格式是:
        bg   [job …]
fg命令可以把后臺(tái)作業(yè)切換成前臺(tái)作業(yè)
其語(yǔ)法格式是:
        fg  [job…]
僅當(dāng)作業(yè)控制被激活,這些命令才起作用


4.12  shell內(nèi)置命令
這些命令構(gòu)造在shell內(nèi)部,從而在shell進(jìn)程內(nèi)執(zhí)行。已在前面介紹過(guò)的內(nèi)置命令:
:,. filename,break [ n ], continue [ n ], cd , echo, exit [ n ] , export, pwd, read, return [ n ] ,  set, shift [ n ] , test, bg, fg, kill等 。

1.eval命令
格式是:  eval  [ arg … ]
可以利用別的命令行作為自己的參數(shù)(arg),進(jìn)行相應(yīng)的變量或命令替換,并把替換結(jié)果結(jié)合成一個(gè)新的命令行,然后讀取并加以執(zhí)行。
#!/bin/bash
getc()
{

stty  raw


tmp=`dd  bs=1  count=1  2>/dev/null`


eval  $1= ' $tmp'


stty  cooked

}
press_any_key()
{

echo  -n  "Strike any key to continue…"


getc  anychar

}
echo  -n  "Enter a character:"
getc  char
echo
echo  "You entered $char "
press_any_key char
echo

2.exec命令
格式是: exec  [ arg … ]
在本shell中執(zhí)行由參數(shù)arg指定的命令,并不創(chuàng)建新進(jìn)程

3.hash命令
格式是: hash  [ -r ]  [ name … ]
可以確定并記住由name指定的每個(gè)命令在搜索路徑中的位置。

4.readonly命令
格式是: readonly  [ name … ]
標(biāo)記給定的name(變量名)是只讀的,以后不能通過(guò)賦值語(yǔ)句改變其值

5.trap命令
用來(lái)設(shè)定接收到某個(gè)信號(hào)所完成的動(dòng)作,忽略某個(gè)信號(hào)的影響或者恢復(fù)該信號(hào)產(chǎn)生時(shí)系統(tǒng)預(yù)設(shè)的動(dòng)作。
其格式是: trap  [ arg ]  [ n ] …
①為某些信號(hào)另外指定處理方式。例如:
      trap  'rm  - f  $temp ; exit '  0  1  2  3  15
②如果arg是空串,如 :
      trap  ""  2
    那么,信號(hào)2就被shell和它引用的命令忽略。
③如果缺省arg,則把所有陷入信號(hào)n的動(dòng)作恢復(fù)成原來(lái)系統(tǒng)設(shè)置的動(dòng)作。如:
      trap  1  2
④如果trap命令后面沒(méi)有任何參數(shù),則顯示與每個(gè)信號(hào)相關(guān)的命令表。

6.type命令
格式是: type  [ name … ]
功能是,對(duì)于每一個(gè)name,如果作為命令名,它是如何被解釋的,如內(nèi)置命令、一般命令搜索路徑等。

7.unset命令
格式是:unset  [ name … ]
刪除由name指定的相應(yīng)變量或函數(shù)。
應(yīng)注意,變量PATH,PS1,PS2,MAILCHECK和IFS不能被刪除,即不能受unset的作用。  

8.umask命令
格式是umask  [-S ] [ mask ]
將用戶文件創(chuàng)建掩碼設(shè)置為mask的值。

9.wait命令
格式是:wait  [ n ]
等待由n(進(jìn)程 ID)指定的進(jìn)程終止,并報(bào)告終止?fàn)顟B(tài)。


4.13  shell腳本調(diào)試
通常采用自底向上的方法,即:先搞清楚要腳本做什么,然后將過(guò)程的連續(xù)階段分解為獨(dú)立的步驟,最后利用shell提示符,交互式地檢查和調(diào)試每個(gè)獨(dú)立的步驟。
編寫(xiě)的腳本無(wú)法執(zhí)行的原因除腳本文件缺少“執(zhí)行”權(quán)限外,有兩種可能:執(zhí)行腳本的環(huán)境設(shè)置不對(duì)和腳本本身有錯(cuò)誤。


4.13.1  解決環(huán)境設(shè)置問(wèn)題
① 不能直接在其他shell下運(yùn)行bash腳本,解決的辦法是在腳本的第一行寫(xiě)上:#!/bin/bash
② 在PATH環(huán)境變量中沒(méi)有包括“.”(當(dāng)前工作目錄)。
    解決辦法是設(shè)置PATH:PATH=$PATH:.
③ 腳本文件與已存在命令的名字相同。


4.13.2  解決腳本錯(cuò)誤
基本的錯(cuò)誤類(lèi)型有兩種:語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤。
語(yǔ)法錯(cuò)誤是編寫(xiě)程序時(shí)違反了所用編程語(yǔ)言的規(guī)則而造成的。
邏輯錯(cuò)誤通常是由于程序的邏輯關(guān)系存在問(wèn)題。對(duì)此類(lèi)問(wèn)題需要進(jìn)行程序調(diào)試。  
一個(gè)很有用的技巧是使用set命令打開(kāi)-x選項(xiàng),或者在啟動(dòng)shell時(shí)使用-x選項(xiàng)將shell設(shè)置成跟蹤模式。
另一個(gè)有用的技巧是在程序中經(jīng)常使用echo或print命令  

TOP

很好
看清提問(wèn)三步曲及多看教程/FAQ索引(wdcp,v3,一鍵包,wdOS),益處多多.wdcp工具集 阿里云主機(jī)8折優(yōu)惠碼

TOP

返回列表