1.1 統(tǒng)計計算機(jī)的軟硬件信息
案例:
#!/bin/bash#使用便利替換定義若干個變量TIME=`date`NAME=`uname -n`KERNEL=`uname -s`VERSION=`uname -r`ARCH=`uname -m`OS=`uname -o`echo echo " Info about your computer"echo " =============================="echo " Current Time: $TIME"echo " Host Name: $NAME"echo " Operating System: $OS"echo " Computer ARCH: $ARCH"echo " Kernel Version: $KERNEL $VERSION"echoexit 0
Shell腳本中定義變量的語法格式:
NAME=value
注意:定義變量的等號兩側(cè)不能有空格;變量的名字只能包含大小寫字母、數(shù)字和下劃線_,并且只能以字母或下劃線開頭;
1.2 如果變量的值是來至于腳本運行后,用戶的輸入數(shù)據(jù)
可以使用read命令把用戶的輸入賦值給變量,使用unset命令刪除一個定義過的變量。
read –p “PRomptinfomation” variable1 variable2 ….
案例:
#!/bin/bashechoread -p " Please input your name:" NAMEecho -e " Welcome,$NAME! /n Your name is saved in variable 'NAME'!"echo "------------------"echo echo " Clear variable 'NAME' using 'unset' command."#清除變量的值unset NAMEecho echo " Now variable 'NAME' is:"#判斷變量是否被清除if [ -z $NAME ]then echo echo " NAME:$NAME" echo " Variable NAME is null."else echo echo " NAME:$NAME" echo " Variable NAME is not null"fiechoecho " quit"echoexit 0
1.3 把變量定義為一個只讀常量
案例:
#!/bin/bashVERSION=2.0#聲明變量VERSION是一個只讀變量readonly VERSIONechoecho -e " Defined readonly variable:/n VERSIN=$VERSION"echo#嘗試修改一個只讀變量,會失敗echo " Try to modify readonly variable VERSION"VERSION=3.0echoecho -e " Readonly variable VERSION doesn't change, /n VERSION=$VERSION"exit 0
一個變量保存多個值
案例:
#!/bin/bash#數(shù)組元素從0開始index=0#從passwd文件中取出所有用戶#指定分隔符為磨耗,使用cut命令從passwd文件的每一行中提取出用戶名for i in `cut -f 1 -d: /etc/passwd`do #把每一個用戶名賦值給user數(shù)組的元素 user[$index]=$i echo user[$index] #每賦值一個用戶后,把索引值加一 let index=$index+1 done#重復(fù)使用變量index作為行號index=1#使用字符@分隔所有的數(shù)組元素#如果沒有使用雙引號引用,使用星號${user[*]}也可以for name in "${ user[@] }"do echo " $index:$name" #行號加一 let index=$index+1doneecho "---------------"echo " Print all users in one line:"echo#把所有的數(shù)組元素作為一個整體進(jìn)行打印echo "${ user[*] }"#把數(shù)組元素作為單個的個體進(jìn)行打印echoecho "---------------"#對user數(shù)組重新賦值,前50個元素將會丟失#即使沒有明確地覆蓋它們echo " Reassign the user array,the user names will be lost:"user=([50]=zhangze,emma,patrick)echoecho ${ user[*] }echoexit 0
語法:
array[index]=value
在Shell腳本中如何創(chuàng)建環(huán)境變量,從而使得子進(jìn)程可以訪問這些變量呢?
把一個變量放到環(huán)境中這個過程通常叫做導(dǎo)出一個變量,Shell中定義并導(dǎo)出一個變量的方法為:
name=value;exportname
或者
export name=value
案例:
parent.sh內(nèi)容如下:
#!/bin/bash#檢查是否指定了命令行選項--export#[]中的字符需要與[]空格開if [ "$1" = "--export" ]then #在父進(jìn)程中定義全局變量 export LOCATION=USAelif [ "$1"="--no-export" ]then #在父進(jìn)程中定義一個本地變量 LOCATION=USAelse #顯示本腳本的使用方法 echo echo -e "`basename $0` --export/texport parent process's variable to child process" echo -e "`basename $0` --no-export/tdon't export parent process's variable to child process" echo exit 0fiecho echo "Your parent is at $LOCATION."#創(chuàng)建子進(jìn)程,子進(jìn)程是否能夠得到LOCATION變量的拷貝依賴于export關(guān)鍵字./child.sh#子進(jìn)程退出,父進(jìn)程繼續(xù)運行echoecho -e "Your parent is at '$LOCATION'."echo -e "Child process and parent process have different LOCATION."echo exit 0
child.sh內(nèi)容如下:
#!/bin/bash#檢查子進(jìn)程中是否有父進(jìn)程中變量LOCATION的拷貝echo "-----------------------"echo " The child is at '${LOCATION:-somewhere not defined}'."#如果子進(jìn)程中擁有變量LOCATION的拷貝,就修改它,如果沒有就定義它LOCATION=CHINA#訪問子進(jìn)程中的變量LOCATIONecho echo " The child is at '$LOCATION'."echo "------------------------------"exit 0
除了我們自己在腳本中創(chuàng)建的本地變量和環(huán)境變量以外,Shell在啟動過程中還會設(shè)置一些特殊的變量來幫助Shell正確運行,這些變量叫做Shell變量。
例如:HOME、SHELL、USER等等。
除了前面介紹的變量,還有一些具有某些特殊功能的特殊變量,它們由Shell創(chuàng)建并只能被Shell修改。
特殊變量:
$0:表示腳本本身
$1、$2、$3依次是腳本后面的選項或參數(shù)的值
$@:表示從$1、$2、$3...的參數(shù)
$#:表示除$0外的所有參數(shù)的個數(shù)
$?:表示shell返回的狀態(tài)
5.1 實現(xiàn)一個顯示文本文件內(nèi)容的腳本,可以通過命令行參數(shù)來告知腳本我們所希望操作的文件
案例:
#!/bin/bash#檢查是否指定了參數(shù)if [ -n "$1" ]then echo #顯示腳本文件名及腳本如何被調(diào)用 echo -e " Script Name:/t/t/t`basename $0`" echo -e " How Script is invoked:/t/t$0 $1" #顯示指定的參數(shù) if [ -f "$1" ] then echo echo "The content of file '$1':"echo "---------------------------"#顯示命令行指定的參數(shù)文件的內(nèi)容echo "`cat $1`"echo "---------------------------" else echo " File $1 don't exist."exit 1 fielse #如果沒有指定參數(shù),顯示幫助信息 echo echo "Show the content of a file" echo echo " Usage." echo " `basename $0` [filename]" echo " $0 [filename]" fiechoexit 0
5.2 如果用戶執(zhí)行腳本時,每一次所指定的參數(shù)個數(shù)都不固定。
案例:
#!/bin/bash#如果沒有指定文件#使用if[-z $1]也可以達(dá)到同樣的效果if [ $# -eq 0 ]then echo echo "Usage:`basename $0` [filename]..." echo "At least specify one filename to remove execute permission for group and others." exit 0 fiecho#檢查是否有其他的參數(shù)#使用until [ -z $1 ]可以達(dá)到同樣的效果while [ $# -gt 0 ]do echo "Processing file '$1'." chmod go-x $1 #刪除第一個參數(shù) shiftdoneecho "Done"echo exit 0
shift命令:
1 shifit 刪除一個參數(shù)
2 shifit n 刪除n個參數(shù)
3 shift “$#” 刪除所有參數(shù)
4 shift $(($# -3)) 刪除除了最后的3個位置參數(shù)外的所有參數(shù)。
5.3 除了特殊變量$#和shift命令組合實現(xiàn)參數(shù)動態(tài)變化,還有$@和$*
案例:
#!/bin/bash#如果沒有指定文件#使用if[-z $1]也可以達(dá)到同樣的效果if [ $# -eq 0 ]then echo echo "Usage:`basename $0` [filename]..." echo "At least specify one filename to remove execute permission for group and others." echo exit 1 fiechoecho "You specified the following parameters:"echo " <<$*>>"echo#遍歷所有參數(shù)for PARAMETER in "$@"do echo " Processing file '$PARAMETER'." #刪除權(quán)限 chmod go-x $PARAMETERdoneecho " Done" exit 0
由于變量$@和$*代表了完整的參數(shù)列表,所以在用while循環(huán)檢查是否還有剩余的參數(shù)等待處理時,還可以使用如下形式:
while [ “$@” != “”] 或者 while [ -n “$@” ]
while [ “$*” != “”] 或者 while [ -n “$*” ]
5.4 查看上個命令是否成功,再根據(jù)結(jié)果采取不同的操作
案例:
#!/bin/bashNEWDIR=~/newdirNEWFILE=newfile#指定log文件為special.pid.logLOGFILE=`basename $0 .sh`.$$.log#在主目錄下創(chuàng)建一個目錄finmkdir $NEWDIRif [ $? -eq 0 ]then #成功地創(chuàng)建log目錄 echo "`date`:Creating Directory '$NEWDIR' succeed." #在log目錄中創(chuàng)建log文件 echo " `date`:Creating Directory '$NEWDIR' succeed." >> $LOGFILE #改變當(dāng)前工作目錄為~、newdir cd $NEWDIR if [ $? -eq 0 ] then echo "`date`:Changing Current Directory to '$NEWDIR' succeed."#當(dāng)前工作目錄改變,因此使用OLDPWDecho "`date`:Changing Current Directory to '$NEWDIR' succeed." >> $OLDPWD/$LOGFILE#然后創(chuàng)建一個新的文件touch $NEWFILEif [ $? -eq 0 ]then echo "`date`:Creating newfile in directory '$NEWDIR' succeed." #當(dāng)前工作目錄改變,因此使用OLDPWD echo "`date`:Creating newfile in directory '$NEWDIR' succeed." >> $OLDPWD/$LOGFILEelse #$? != 0 意味著失敗 echo "`date`:Creating newfile in directory '$NEWDIR' failed." #當(dāng)前工作目錄改變,因此使用OLDPWD echo "`date`:Creating newfile in directory '$NEWDIR' failed." >> $OLDPWD/$LOGFILEfi else #$? != 0 意味著失敗 echo "`date`:Changing Current Directory to '$NEWDIR' failed." #當(dāng)前工作目錄改變,因此使用OLDPWD echo "`date`:Changing Current Directory to '$NEWDIR' failed." >> $OLDPWD/$LOGFILE fi else #$? != 0 意味著失敗 echo "`date`:Creating directory '$NEWDIR' failed." echo "`date`:Creating directory '$NEWDIR' failed." >> $LOGFILE fi echo "Please check log file $LOGFILE." echo exit 0
變量$?:在Unix/linux系統(tǒng)中,每一個命令或腳本在結(jié)束運行后都會返回一個0到255之間的數(shù)值,用來表示是否成功執(zhí)行,這個數(shù)值被Shell保存在特殊變量$?中。數(shù)值0通常用來表示成功執(zhí)行,而1或1以上的其他數(shù)字則代表失敗和各種各樣的錯誤。
注意:
1 當(dāng)位置變量大于或等于10后,必須使用花括號,如{10}。這樣,Shell不會當(dāng)成位置變量$1+0
2 不可以該表位置變量的值,且普通變量不能以數(shù)字開頭
3 在for循環(huán)遍歷完整的參數(shù)列表時,應(yīng)該使用$@而不是$*
新聞熱點
疑難解答