Linux 腳本編寫基礎.doc_第1頁
Linux 腳本編寫基礎.doc_第2頁
Linux 腳本編寫基礎.doc_第3頁
Linux 腳本編寫基礎.doc_第4頁
Linux 腳本編寫基礎.doc_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

Linux 腳本編寫基礎 1. Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個例子中我們使用/bin/sh來執(zhí)行程序。當編輯好腳本時,如果要執(zhí)行該腳本,還必須使其可執(zhí)行。要使腳本可執(zhí)行:編譯 chmod +x filename 這樣才能用./filename 來運行1.1.2 注釋在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。我們真誠地建議您在程序中使用注釋。如果您使用了注釋,那么即使相當長的時間內(nèi)沒有使用該腳本,您也能在很短的時間內(nèi)明白該腳本的作用及工作原理。1.1.3 變量在其他編程語言中您必須使用變量。在shell編程中,所有的變量都由字符串組成,并且您不需要對變量進行聲明。要賦值給一個變量,您可以這樣寫:#!/bin/sh#對變量賦值:a=hello world# 現(xiàn)在打印變量a的內(nèi)容:echo A is:echo $a有時候變量名很容易與其他文字混淆,比如:num=2echo this is the $numnd這并不會打印出this is the 2nd,而僅僅打印this is the ,因為shell會去搜索變量numnd的值,但是這個變量時沒有值的??梢允褂没ɡㄌ杹砀嬖Vshell我們要打印的是num變量:num=2echo this is the $numnd這將打?。?this is the 2nd1.1.4 環(huán)境變量由export關鍵字處理過的變量叫做環(huán)境變量。我們不對環(huán)境變量進行討論,因為通常情況下僅僅在登錄腳本中使用環(huán)境變量。1.1.5 Shell命令和流程控制在shell腳本中可以使用三類命令:1)Unix 命令:雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。常用命令語法及功能echo some text: 將文字內(nèi)容打印在屏幕上ls: 文件列表wc l filewc -w filewc -c file: 計算文件行數(shù)計算文件中的單詞數(shù)計算文件中的字符數(shù)cp sourcefile destfile: 文件拷貝mv oldname newname : 重命名文件或移動文件rm file: 刪除文件grep pattern file: 在文件內(nèi)搜索字符串比如:grep searchstring file.txtcut -b colnum file: 指定欲顯示的文件內(nèi)容范圍,并將它們輸出到標準輸出設備比如:輸出每行第5個到第9個字符cut -b5-9 file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令cat file.txt: 輸出文件內(nèi)容到標準輸出設備(屏幕)上file somefile: 得到文件類型read var: 提示用戶輸入,并將輸入賦值給變量sort file.txt: 對file.txt文件中的行進行排序uniq: 刪除文本文件中出現(xiàn)的行列比如: sort file.txt | uniqexpr: 進行數(shù)學運算Example: add 2 and 3expr 2 + 3find: 搜索文件比如:根據(jù)文件名搜索find . -name filename -printtee: 將數(shù)據(jù)輸出到標準輸出設備(屏幕) 和文件比如:somecommand | tee outfilebasename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tuxdirname file: 返回文件所在路徑比如:dirname /bin/tux將返回 /binhead file: 打印文本文件開頭幾行tail file : 打印文本文件末尾幾行sed: Sed是一個基本的查找替換程序??梢詮臉藴瘦斎耄ū热缑罟艿溃┳x入文本,并將結(jié)果輸出到標準輸出(屏幕)。該命令采用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為LinuxFocus :cat text.file | sed s/linuxfocus/LinuxFocus/ newtext.fileawk: awk 用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, print $1 , $3 這里我們使用,作為字段分割符,同時打印第一個和第三個字段。如果該文件內(nèi)容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令輸出結(jié)果為:Adam Bor, IndiaKerry Miller, USA2) 概念: 管道, 重定向和 backtick這些不是系統(tǒng)命令,但是他們真的很重要。管道 (|) 將一個命令的輸出作為另外一個命令的輸入。grep hello file.txt | wc -l在file.txt中搜索包含有”hello”的行并計算其行數(shù)。在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。重定向:將命令的結(jié)果輸出到文件,而不是標準輸出(屏幕)。 寫入文件并覆蓋舊文件 加到文件的尾部,保留舊文件內(nèi)容。反短斜線使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數(shù)。命令:find . -mtime -1 -type f -print用來查找過去24小時(-mtime 2則表示過去48小時)內(nèi)修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:#!/bin/sh# The ticks are backticks () not normal quotes ():tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print3) 流程控制1.ifif 表達式 如果條件為真則執(zhí)行then后面的部分:if .; then .elif .; then .else .fi大多數(shù)情況下,可以使用測試命令來對條件進行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等通常用 來表示條件測試。注意這里的空格很重要。要確保方括號的空格。 -f somefile :判斷是否是一個文件 -x /bin/ls :判斷/bin/ls是否存在并有可執(zhí)行權(quán)限 -n $var :判斷$var變量是否有值 $a = $b :判斷$a和$b是否相等執(zhí)行man test可以查看所有測試表達式可以比較和判斷的類型。直接執(zhí)行以下腳本:#!/bin/shif $SHELL = /bin/bash ; thenecho your login shell is the bash (bourne again shell)elseecho your login shell is not bash but $SHELLfi變量$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較??旖莶僮鞣煜語言的朋友可能會很喜歡下面的表達式: -f /etc/shadow & echo This computer uses shadow passwors這里 & 就是一個快捷操作符,如果左邊的表達式為真則執(zhí)行右邊的語句。您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則打印” This computer uses shadow passwors”。同樣或操作(|)在shell編程中也是可用的。這里有個例子:#!/bin/shmailfolder=/var/spool/mail/james -r $mailfolder echo Can not read $mailfolder ; exit 1; echo $mailfolder has mail from:grep From $mailfolder該腳本首先判斷mailfolder是否可讀。如果可讀則打印該文件中的From 一行。如果不可讀則或操作生效,打印錯誤信息后腳本退出。這里有個問題,那就是我們必須有兩個命令:-打印錯誤信息-退出程序我們使用花括號以匿名函數(shù)的形式將兩個命令放到一起作為一個命令使用。一般函數(shù)將在下文提及。不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。2.casecase :表達式可以用來匹配一個給定的字符串,而不是數(shù)字。case . in.) do something here ;esac讓我們看一個例子。 file命令可以辨別出一個給定文件的文件類型,比如:file lf.gz這將返回:lf.gz: gzip compressed data, deflated, original filename,last modified: Mon Aug 27 23:09:18 2001, os: Unix我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2, gzip 和zip 類型的壓縮文件:#!/bin/shftype=file $1case $ftype in$1: Zip archive*)unzip $1 ;$1: gzip compressed*)gunzip $1 ;$1: bzip2 compressed*)bunzip2 $1 ;*) echo File $1 can not be uncompressed with smartzip;esac您可能注意到我們在這里使用了一個特殊的變量$1。該變量包含了傳遞給該程序的第一個參數(shù)值。也就是說,當我們運行:smartzip articles.zip$1 就是字符串 articles.zip3. selsectselect 表達式是一種bash的擴展應用,尤其擅長于交互式使用。用戶可以從一組不同的值中進行選擇。select var in . ; dobreakdone. now $var can be used .下面是一個例子:#!/bin/shecho What is your favourite OS?select var in Linux Gnu Hurd Free BSD Other; dobreakdoneecho You have selected $var下面是該腳本運行的結(jié)果:What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have selected Linux4.looploop表達式:while .; do.donewhile-loop 將運行直到表達式測試為真。will run while the expression that we test for is true.關鍵字break 用來跳出循環(huán)。而關鍵字”continue”用來不執(zhí)行余下的部分而直接跳到下一個循環(huán)。for-loop表達式查看一個字符串列表 (字符串用空格分隔) 然后將其賦給一個變量:for var in .; do .done在下面的例子中,將分別打印ABC到屏幕上:#!/bin/shfor var in A B C ; do echo var is $vardone下面是一個更為有用的腳本showrpm,其功能是打印一些RPM包的統(tǒng)計信息:#!/bin/sh# list a content summary of a number of RPM packages# USAGE: showrpm rpmfile1 rpmfile2 .# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpmfor rpmpackage in $*; doif -r $rpmpackage ;thenecho = $rpmpackage =rpm -qi -p $rpmpackageelseecho ERROR: cannot read file $rpmpackagefidone這里出現(xiàn)了第二個特殊的變量$*,該變量包含了所有輸入的命令行參數(shù)值。如果您運行showrpm openssh.rpm w3m.rpm webgrep.rpm此時 $* 包含了 3 個字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.5. 引號在向程序傳遞任何參數(shù)之前,程序會擴展通配符和變量。這里所謂擴展的意思是程序會把通配符(比如*)替換成合適的文件名,它變量替換成變量值。為了防止程序作這種替換,您可以使用引號:讓我們來看一個例子,假設在當前目錄下有一些文件,兩個jpg文件, mail.jpg 和tux.jpg。1.2 編譯SHELL腳本#ch#!/bin/sh mod +x filenamecho *.jpg 緩螅梢醞淙耄?./filename 來執(zhí)行您的腳本。這將打印出mail.jpg tux.jpg的結(jié)果。 引號 (單引號和雙引號) 將防止這種通配符擴展:#!/bin/shecho *.jpgecho *.jpg這將打印*.jpg 兩次。單引號更嚴格一些。它可以防止任何變量擴展。雙引號可以防止通配符擴展但允許變量擴展。#!/bin/shecho $SHELLecho $SHELLecho $SHELL運行結(jié)果為:/bin/bash/bin/bash$SHELL最后,還有一種防止這種擴展的方法,那就是使用轉(zhuǎn)義字符反斜桿:echo *.jpgecho $SHELL這將輸出:*.jpg$SHELL6. Here documents當要將幾行文字傳遞給一個命令時,here documents(譯者注:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個 here documents就不必用echo函數(shù)一行行輸出。 一個 Here document 以 4)函數(shù)如果您寫了一些稍微復雜一些的程序,您就會發(fā)現(xiàn)在程序中可能在幾個地方使用了相同的代碼,并且您也會發(fā)現(xiàn),如果我們使用了函數(shù),會方便很多。一個函數(shù)是這個樣子的:functionname()# inside the body $1 is the first argument given to the function# $2 the second .body您需要在每個程序的開始對函數(shù)進行聲明。下面是一個叫做xtitlebar的腳本,使用這個腳本您可以改變終端窗口的名稱。這里使用了一個叫做help的函數(shù)。正如您可以看到的那樣,這個定義的函數(shù)被使用了兩次。#!/bin/sh# vim: set sw=4 ts=4 et:help()cat shift by 2-) shift;break; # end of options-*) echo error: no such option $1. -h for help;exit 1;*) break;esacdoneecho opt_f is $opt_fecho opt_l is $opt_lecho first arg is $1echo 2nd arg is $2您可以這樣運行該腳本:cmdparser -l hello -f - -somefile1 somefile2返回的結(jié)果是:opt_f is 1opt_l is hellofirst arg is -somefile12nd arg is somefile2這個腳本是如何工作的呢?腳本首先在所有輸入命令行參數(shù)中進行循環(huán),將輸入?yún)?shù)與case表達式進行比較,如果匹配則設置一個變量并且移除該參數(shù)。根據(jù)unix系統(tǒng)的慣例,首先輸入的應該是包含減號的參數(shù).第2部分 實例現(xiàn)在我們來討論編寫一個腳本的一般步驟。任何優(yōu)秀的腳本都應該具有幫助和輸入?yún)?shù)。并且寫一個偽腳本(framework.sh),該腳本包含了大多數(shù)腳本都需要的框架結(jié)構(gòu),是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執(zhí)行一下copy命令:cp framework.sh myscript然后再插入自己的函數(shù)。讓我們再看兩個例子:二進制到十進制的轉(zhuǎn)換腳本 b2d 將二進制數(shù) (比如 1101) 轉(zhuǎn)換為相應的十進制數(shù)。這也是一個用expr命令進行數(shù)學運算的例子:#!/bin/sh# vim: set sw=4 ts=4 et:help()cat -shell編程簡介 作者: 何斌武 (,大連理工大學網(wǎng)絡中心,April 1999.) Bourne Shell 介紹:Bourne Shell 基礎及其他很多有用的特性,shell編程及組織。 主要內(nèi)容: .shell基礎 基本介紹,環(huán)境,選項,特殊字符 .shell變量 用戶定義變量,環(huán)境變量,位置變量(shell 參數(shù)) .shell script編程 條件測試,循環(huán)及重復控制 .shell定制 1.shell基礎知識 作者:Stephen Bourne 在Bell實驗室開發(fā) 建議:man sh 查看相關UNIX上的改進或特性 (1)shell提示符及其環(huán)境 /etc/passwd文件 提示符:$ /etc/profile $HOME/.profile (2)shell執(zhí)行選項 -n 測試shell script語法結(jié)構(gòu),只讀取shell script但不執(zhí)行 -x 進入跟蹤方式,顯示所執(zhí)行的每一條命令,用于調(diào)度 -a Tag all variables for export -c string 從strings中讀取命令 -e 非交互方式 -f 關閉shell文件名產(chǎn)生功能 -h locate and remember functions as defind -i 交互方式 -k 從環(huán)境變量中讀取命令的參數(shù) -r 限制方式 -s 從標準輸入讀取命令 -t 執(zhí)行命令后退出(shell exits) -u 在替換中如使用未定義變量為錯誤 -v verbose,顯示shell輸入行 這些選項可以聯(lián)合使用,但有些顯然相互沖突,如-e和-i. (3)受限制shell(Restircted Shell) sh -r 或 /bin/rsh 不能執(zhí)行如下操作:cd, 更改PATH,指定全路徑名,輸出重定向,因此可以提供一個較 好的控制和安全機制。通常rsh用于應用型用戶及撥號用戶,這些用戶通常是看不到提 示符的。通常受限制用戶的主目錄是不可寫的。 不足:如果用戶可以調(diào)用sh,則rsh的限制將不在起作用,事實上如果用戶在vi及more 程序中調(diào)用shell,而這時rsh的限制將不再起作用。 (4)用set改變 shell選項 用戶可以在$提示符下用set命令來設置或取消shell的選項。使用-設置選項,+取消相應 選項,大多數(shù)UNIX系統(tǒng)允許a,e,f,h,k,n,u,v和x的開關設置/取消。 set -xv 啟動跟蹤方式;顯示所有的命令及替換,同樣顯示輸入。 set -tu 關閉在替換時對未定義變量的檢查。 使用echo $-顯示所有已設置的shell選項。 (5)用戶啟動文件 .profile PATH=$PATH:/usr/loacl/bin; export PATH (6)shell環(huán)境變量 CDPATH 用于cd命令的查找路徑 HOME /etc/passwd文件中列出的用戶主目錄 IFS Internal Field Separator,默認為空格,tab及換行符 MAIL /var/mail/$USERNAME mail等程序使用 PATH PS1,PS2 默認提示符($)及換行提示符() TERM 終端類型,常用的有vt100,ansi,vt200,xterm等 示例:$PS1=test:;export PS1 test: PS1=$;export PS1 $echo $MAIL /var/mail/username (7)保留字符及其含義 $ shell變量名的開始,如$var | 管道,將標準輸出轉(zhuǎn)到下一個命令的標準輸入 # 注釋開始 & 在后臺執(zhí)行一個進程 ? 匹配一個字符 * 匹配0到多個字符(與DOS不同,可在文件名中間使用,并且含.) $- 使用set及執(zhí)行時傳遞給shell的標志位 $! 最后一個子進程的進程號 $# 傳遞給shell script的參數(shù)個數(shù) $* 傳遞給shell script的參數(shù) $ 所有參數(shù),個別的用雙引號括起來 $? 上一個命令的返回代碼 $0 當前shell的名字 $n (n:1-) 位置參數(shù) $ 進程標識號(Process Identifier Number, PID) file 輸出重定向 command 命令替換,如 filename=basename /usr/local/bin/tcsh fiile 輸出重定向,append 轉(zhuǎn)義符及單引號: $echo $HOME $PATH /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: $echo $HOME $PATH $HOME $PATH $echo $HOME $PATH $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbwork/bin 其他: $dir=ls $dir $alias dir ls $dir ls filelist ls filelist wc -l 2. shell變量 變量:代表某些值的符號,如$HOME,cd命令查找$HOME,在計算機語言中可以使用變量可以 進行多種運算和控制。 Bourne Shell有如下四種變量: .用戶自定義變量 .位置變量即 shell script之參數(shù) .預定義變量(特殊變量) .環(huán)境變量(參考shell定制部分) (1)用戶自定義變量(數(shù)據(jù)的存儲) $ COUNT=1 $ NAME=He Binwu 技巧:因為大部分UNIX命令使用小寫字符,因此在shell編程中通常使用全大寫變量, 當然這并不是強制性的,但使用大寫字符可以在編程中方便地識別變量。 變量的調(diào)用:在變量前加$ $ echo $HOME /home/hbwork $ WEEK=Satur $ echo Today is $WEEKday Today is $echo Today is $WEEKday Today is Saturday Shell變量賦值從右從左進行(Linux Shell/bash從左向右賦值!) $ X=$Y Y=y $ echo $X y $ Z=z Y=$Z $ echo $Y $ 使用unset命令刪除變量的賦值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z $ 有條件的命令替換 在Bourne Shell中可以使變量替換在特定條件下執(zhí)行,即有條件的環(huán)境變量替換。 這種變量替換總是用大括號括起來的。 .設置變量的默認值 在變量未賦值之前其值為空。Bourne Shell允許對變量設置默認值,其格式如下: $variable:-defaultvalue 例: $ echo Hello $UNAME Hello $ echo Hello $UNAME:-there Hello there $ echo $UNAME #變量值并未發(fā)生變化 $ UNAME=hbwork $ echo Hello $UNAME:-there Hello hbwork $ .另一種情況:改變變量的值,格式如下: $variable:=value 例: $ echo Hello $UNAME Hello $ echo Hello $UNAME:=there Hello there $ echo $UNAME #變量值并未發(fā)生變化 there $ .變量替換中使用命令替換 $USERDIR=$MYDIR:-pwd .在變量已賦值時進行替換 $variable:+value .帶有錯誤檢查的有條件變量替換 $variable:?value 例: $ UNAME= $ echo $UNAME:?UNAME has not been set UNAME: UNAME has not been set $ echo $UNAME:? UNAME: parameter null or not set (2)位置變量(Shell參數(shù)) 在shell script中位置參數(shù)可用$1.$9表示,$0表示內(nèi)容通常為當前執(zhí)行程序的文件名。 .防止變量值被替換 readonly variable .使用export命令輸出變量,使得變量對子shell可用,當shell執(zhí)行一下程序時,shell 將為其設置一個新的環(huán)境讓其執(zhí)行,這稱之了subshell. 在Bourne Shell中變量通常 被認為是本地變量,也就是說在對其賦值之外的shell環(huán)境之外是不認識此變量的。使 用export對subshell可用。 例:對變量PS1的export操作,shell的提示符將發(fā)生變化。 $ PS1=hostname$ peony$sh $ echo $PS1 $ 3.Shell Script編程 目的:使用UNIX所提供的最常用工具來完成所需復雜任務的強大功能。 (1)最簡單的Shell 編程 $ls -R / |grep myname |more 每天數(shù)據(jù)的備份: $ cd /usr/yourname; ls * |cpio -o /dev/rmt/0h 書寫程序的目的是一次編程,多次使用(執(zhí)行)! $ cat backup.sh cd /home/hbwork ls * | cpio -o /dev/rmt/0h D 執(zhí)行: $ sh backup.sh 或: $ chmod +x backup.sh $ ./backup.sh 技巧:在shell script中加入必要的注釋,以便以后閱讀及維護。 (2)shell是一個(編程)語言 同傳統(tǒng)的編程語言一樣,shell提供了很多特性,這些特性可以使你的shell script 編程更為有用,如:數(shù)據(jù)變量、參數(shù)傳遞、判斷、流程控制、數(shù)據(jù)輸入和輸出,子 程序及以中斷處理等。 . 在shell編程中使用數(shù)據(jù)變量可以將程序變量更為通用,如在上面backup.sh中: cd $WORKDIR ls * | cpio -o /dev/rmt/0h . Shell編程中的注釋以#開頭 . 對shell變量進行數(shù)字運算,使用expr命令 expr integer operator integer 其中operator為+ - * / %, 但對*的使用要用轉(zhuǎn)義符,如: $expr 4 * 5 20 $int=expr 5 + 7 $echo $int 12 (3)Shell編程的參數(shù)傳遞, 可通過命令行參數(shù)以及交互式輸入變量(read) restoreall.sh 對backup.sh程序的備份磁帶進行恢復 $cat restoreall.sh cd $WORKDIR cpio -i $restore1 file1 恢復多個文件restoreany : #restoreany -program to restore a single file cd $WORKDIR cpio -i $* $ restoreany file1 file2 file3 (4)條件判斷 . if-then語句,格式如下: if command_1 then command_2 command_3 fi command_4 在if-then語句中使用了命令返回碼$?,即當command_1執(zhí)行成功時才執(zhí)行command_2和 command_3,而command_4總是執(zhí)行. 示例程序unload: 在備份成功時刪除原始文件,帶有錯誤檢查 cd $1 #備份時未考慮不成功的情況! ls -a | cpio -o /dev/rmt/0h rm -rf * 改進如下: #當使用了管道命令時,管理命令的返回代碼為最后一個命令的返回代碼 if ls -a | cpio -o /dev/rmt/0h then rm -rf * fi . if-then-else語句 if command_1 then command_2 else command_3 fi 技巧: 由于shell對命令中的多余的空格不作任何處理,一個好的程序員會用這一特性 對自己的程序采用統(tǒng)一的縮進格式,以增強自己程序的可讀性. . 使用test命令進行進行條件測試 格式: test conditions test在以下四種情況下使用: a. 字符比較 b.兩個整數(shù)值的比較 c. 文件操作,如文件是否存在及文件的狀態(tài)等 d. 邏輯操作,可以進行and/or,與其他條件聯(lián)合使用 a. 測試字符數(shù)據(jù): shell變量通常民政部下均作為字符變量 str1 = str2 二者相長,相同 str1 != str2 不同 -n string string不為空(長度不為零) -z string string為空 string string不為空 例: $ str1=abcd #在含有空格時必須用引號括起來 $ test $str1=abcd $ echo $? 0 $ str1=abcd $ test $str1=abcd $ echo $? 1 Note: 在test處理含有空格的變量時最好用引號將變量括起來,否則會出現(xiàn)錯誤的結(jié)果, 因為shell在處理命令行時將會去掉多余的空格,而用引號括起來則可以防止 shell去掉這些空格. 例: $ str1= $ test $str1 $ echo $? 1 $ test $str1 $ echo $? 0 $ test -n $str1 test: argument expected $ test -n $str1 $ echo $? 0 $ b. 整數(shù)測試: test與expr相同,可以將字符型變量轉(zhuǎn)換為整數(shù)進行操作,expr進行 整數(shù)的算術運算,而test則進行邏輯運算. 表達式 說明 - int1 -eq int2 相等? int1 -ne int2 不等? int1 -gt int2 int1 int2 ? int1 -ge int2 int1 = int2 ? int1 -lt int2 int1 例: $ int1=1234 $ int2=01234 $ test $int1 -eq $int2 $ echo $? 0 c. 文件測試:檢查文件狀態(tài)如存在及讀寫權(quán)限等 -r filename 用戶對文件filename有讀權(quán)限? -w filename 用戶對文件filename有寫權(quán)限? -x filename 用戶對文件filename有可執(zhí)行權(quán)限? -f filename 文件filename為普通文件? -d filename 文件filename為目錄? -c filename 文件filename為字符設備文件? -b filename 文件filename為塊設備文件? -s filename 文件filename大小不為零? -t fnumb 與文件描述符fnumb(默認值為1)相關的設備是一個終端設備? d. 測試條件之否定,使用! 例: $ cat /dev/null empty $ test -r empty $ echo $? 0 $ test -s empty 1 $ test ! -s empty $ echo $? 0 e. 測試條件之邏輯運算 -a And -o Or 例: $ test -r empty -a -s empty $ echo $? 1 f. 進行test測試的標準方法 因為test命令在 shell編程中占有很重要的地位,為了使shell能同其他編程語言一樣 便于閱讀和組織, Bourne Shell在使用test測試時使用了另一種方法:用方括號將整個 test測試括起來: $ int1=4 $ $int1 -gt 2 $ echo $? 0 例: 重寫unload程序,使用test測試 #!/bin/sh #unload - program to backup and remove files #syntax: unload directory #check arguments if $# -ne 1 then echo usage: $0 directory exit 1 fi #check for valid directory name if ! -d $1 then echo $1 is not a directory exit 2 fi cd $1 ls -a | cpio -o /dev/rmt/0h if $? -eq 0 then rm -rf * else echo A problem has occured in creating backup echo The directory will not be ereased echo Please check the backup device exit 3 fi # end of unload 在如上示例中出現(xiàn)了exit, exit有兩個作用:一是停止程序中其他命令的執(zhí)行,二是 設置程序的退出狀態(tài) g. if嵌套及elif結(jié)構(gòu) if command then command else if command then command else if command then command fi fi fi 改進:使用elif結(jié)構(gòu) if command then command elif command then command elif command then command fi elif結(jié)構(gòu)同if結(jié)構(gòu)類似,但結(jié)構(gòu)更清淅,其執(zhí)行結(jié)果完全相同. h.交互式從鍵盤讀入數(shù)據(jù) 使用read語句,其格式如下: read var1 var2 . varn read將不作變量替換,但會刪除多余的空格,直到遇到第一個換行符(回車), 并將輸入值依次賦值給相應的變量。 例: $ read var1 var2 var3 Hello my friends $ echo $var1 $var2 $var3 Hello my friends $ echo $var1 Hello $ read var1 var2 var3 Hello my dear friends $ echo $var3 dear friends 在shell script中可使用read語句進行交互操作: . #echo -n message 輸出結(jié)果后不換行 echo -n Do you want to continue: Y or N read ANSWER if $ANSWER=N -o $ANSWER=n then exit fi i. case結(jié)構(gòu):結(jié)構(gòu)較elif-then結(jié)構(gòu)更清楚 比較if-then語句: if variable1 = value1 then command command elif variable1 = value2 then command command elif variable1 = value3 then command command fi 相應的case結(jié)構(gòu): case value in pattern1) command command; pattern2) command command; . patternn) command; esac * case語句只執(zhí)行第一個匹配模式 例:使用case語句建立一個菜單選擇shell script #Display a menu echo _ echo 1 Restore echo 2 Backup echo 3 Unload echo #Read and excute the users selection echo -n Enter Choice: read CHOICE case $CHOICE in 1) echo Restore; 2) echo Backup; 3) echo Unload; *) echo Sorry $CHOICE is not a valid choice exit 1 esac 在上例中,*指默認匹配動作。此外,case模式中也可以使用邏輯操作,如下所示: pattern1 | pattern2 ) command command ; 這樣可以將上面示例程序中允許用戶輸入數(shù)字或每一個大寫字母。 case $CHOICE in 1|R) echo Restore; 2|B) echo Backup; 3|U) echo Unload; *) echo Sorry $CHOICE is not a valid choice exit 1 esac (5)循環(huán)控制 while循環(huán): 格式: while command do command command command . done 例: 計算1到5的平方 #!/bin/sh # #Filename: square.sh int=1 while $int -le 5 do sq=expr $int * $in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論