前言: 這裡只介紹B-SHELL的一些運用方法,不對B-SHELL的基本知識進行說明(與其他的語言有很多的共性,果你懂一種語言的話,很快就能上手),如你是對B-SHELL不是很了解的話,而且又想學的話,建議你去查閱相關的資料(網上有很多關於這方面的東東;當然也可買些書;如果你是一個借別人的書才能閱讀的人,那就去借吧!我就是這樣的人之一。)。我的能力有限,若有不足或錯誤,請多多指教,小弟將感激不盡!所有的介紹適合於內核2.2.13的及以上的liunx環境。 B-SHELL是一個便捷的開發工具,在緊急情況下要實現產品的某一功能,而用C語言不能很快完成,則可選擇B-SHLL實現,日後再用C語言完成;在產品裡對於那些不常運行的程序可用B-SHELL替代,這樣可以避免因對C語言使用不當而帶來的不良後果;對於一些處理量不大的程序可用B-SHELL實現。 討論: #!/bin/sh à B-SHELL的解釋器標志 ALL=$@ #{ B-SHELL中帶”$”的變量的說明:$0à SHELL命令本身 $nà 位置參數n(n != 0) $@à 所有的輸入變量 $$à 當前進程號 $!à 最近後台進程的PID值 $?à 最近命令執行狀態的返回值 $#à 參數的個數 }# declare -x TIME=0 #{ 變量聲明的說明: declare 聲明全局變量;如果在函數內聲明,則只在函數內有效(局部變量);-x表明變量值可以傳遞給後繼命令(從函數傳值給後繼命令);-i表明變量作為整型處理;-r表明變量為只度;用“+”代替“-”,原有變量的聲明屏蔽,恢復為無定義狀態。由第一次賦值決定其參數在腳本中的性質,如果首次是字符,以後都當字符處理,其它等同。 local聲明局部變量;local 變量名 [ = “值”];一般在函數內部運用。 直接定義變量,不用declare 和local指明。由第一次賦值決定其參數在腳本中的性質,如果首次是字符,以後都當字符處理,其它等同。也可在定義確定。 }# declare -x NUMBEROFFILE=0 #{ 關於腳本函數說明: 定義方式:function 函數名() 或 函數名() { 函數體(作你想要作的事) } 調用方式:函數名 參數列 在腳本裡函數的調用就象調用命令一樣使用。à 後面將會提到 }# function hel_ver() à 顯示幫助信息或版本號 { if [ "$1" = "-h" ] ;then echo "fstrf -v :show version of shell script." echo "Usages : fstrf -h-v " echo " fstrf ARGUMENTS DirectorY STRING fstrf ARGUMENTS STRING " echo " For more informations run man fstrf." exit fi if [ "$1" = "-v" ] [ "$1" = "version" ];then echo "fstrf version 1.0.1 2001/07/05." exit fi } function find_offer() à 在給定的目錄下查找是否有包含指定字串的文件,並顯示其路徑 { for file in `ls "$1"` à for var in command do ………done 的一個典型運用;對$1目錄下的目錄或文件進行處理 do if [ -d "$1"/$file ];then à 判斷$file是否為目錄 continue else string=`grep "$2" "$1"/$file ` à 查找字串 if [ -n "$string" ];then à 判斷字串為非空 echo $string > /str str=`awk '{print $1 }' /str` à 取得str 的第一域值 rm /str if [ "$str" != "Binary" ];then à 剔除二進制文件 NUMBEROFFILE=`eXPr $NUMBEROFFILE + 1 ` à 相當於C語言的NUMBEROFFILE +=1;可用 let ‘ NUMBEROFFILE=NUMBEROFFILE + 1‘替換 TIME=`expr $TIME + 1` echo "$1/$file" à 顯示匹配文件 fi fi fi done } #else function find_curr() à 在當前目錄下查找是否有包含指定字串的文件,並顯示其路徑(相對路徑)實現機制與find_offer相同 { # if [ "$#" -eq "1" ];then à for file in `ls ./` 如果只輸入一個參數,則查找當前工作目錄下的文件 do if [ -d "$file" ];then continue else string=`grep "$1" $file` if [ -n "$string" ];then echo $string > /str str=`awk '{print $1 }' /str` rm /str if [ "$str" != "Binary" ];then NUMBEROFFILE=`expr $NUMBEROFFILE + 1 ` TIME=`expr $TIME + 1` echo "./$file" fi fi fi done } function print_num() à 顯示查找的文件數 (在查多級目錄時未能實現,如果你知道,告訴我,我會很高興的!) { if [ "$NUMBEROFFILE" -gt "0" ] ;then # echo "" if [ "$#" -eq "1" ];then #{ 關於彩色顯示的說明: 不同的Linux系統,運行的命令的方式都不一樣。在LINUX/BSD系統中:echo -e “\033[40;32m”;在V系統中:echo “\033[40;32m”。本例中采用前一種方式。40位為背景色,取值4047之間;32位為前景色,取值3037之間;\033是固定用法。彩色顯示要成隊匹配,如腳本所示。通常後一個色彩控制為 echo -e "\033[40;37m" (意思是恢復正常色)。彩色顯示控制通常是成對出現,例如, `echo -e "\033[40;33m"`"$2"`echo -e "\033[40;37m"` echo -e "\033[40;37m"à 恢復正常顯示(黑背景,白前景)。利用彩色顯示控可以作出漂亮的liunx菜單(當然不能與Xwindows和WINDOWS相比)。 }# echo "Finded `echo -e "\033[40;32m"`$NUMBEROFFILE`echo -e "\033[40;37m"` file(s) which have the string `echo -e "\033[40;33m"`"$1"`echo -e "\033[40;37m"` ." else echo "Finded `echo -e "\033[40;32m"`$NUMBEROFFILE`echo -e "\033[40;37m"` file(s) which have the string `echo -e "\033[40;33m"`"$2"`echo -e "\033[40;37m"`. " fi else if [ -z "$2" ];then echo "Finded `echo -e "\033[40;32m"`no `echo -e "\033[40;37m"`file under current directory." else echo "Finded `echo -e "\033[40;32m"`no `echo -e "\033[40;37m"`file under directory "$1"." fi fi } function fdir() à 從給定的目錄開始查找當前目錄及其子目錄的包含的目錄,並存入/tmp/dtmp文件。 { >/tmp/dtmp #cd / echo "$1" >/tmp/dtmp tmp=`echo $1 grep "\/proc"`à 不查找/proc目錄下的目錄 if [ ! -z $tmp ];then # echo "/proc" exit fi i=`expr $i + 1 ` à 記錄找到的目錄數目,每向/tmp/dtmp文件加一目錄記錄時此值加一(以下同樣) ###first grade cd $1 à 進入腳本的工作目錄(不會改變控制台的工作目錄) for loop in `ls ./` do # echo $loop if [ -d $loop ];then à 判斷$loop是否為目錄(以下同樣) tmp=`echo $loop grep "proc"` if [ ! -z $tmp ];then continue fi i=`expr $i + 1 ` echo "`pwd`/$loop" >>/tmp/dtmp à 連同目錄的絕對路徑加入/tmp/dtmp文件(以下同樣) ###second grade cd $loop à 進入腳本二級工作目錄 for loop1 in `ls ./` do # echo $loop1 if [ -d $loop1 ];then tmp=`echo $loop1 grep "proc"` if [ ! -z $tmp ];then continue fi i=`expr $i + 1 ` echo "`pwd`/$loop1" >>/tmp/dtmp ###third grade cd $loop1à 進入腳本三級工作目錄 for loop1 in `ls ./` do # echo $loop1 if [ -d $loop1 ];then i=`expr $i + 1 ` echo "`pwd`/$loop1" >>/tmp/dtmp