歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 介紹B-SHELL的一些運用方法

介紹B-SHELL的一些運用方法

日期:2017/2/27 9:26:19   编辑:SHELL編程
  前言:    這裡只介紹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位為背景色,取值40��47之間;32位為前景色,取值30��37之間;\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




Copyright © Linux教程網 All Rights Reserved