[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Shell > 正文
介紹B-SHELL的一些運用方法
本文出自:http://www.fanqiang.com 作者: truename [luoli1974@163.com] (2001-08-22 17:30:12)

前言:

這裡只介紹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

#{

變量聲明的說明:

  1. declare 聲明全局變量;如果在函數內聲明,則只在函數內有效(局部變量);-x表明變量值可以傳遞給繼命令(從函數傳值給繼命令);-i表明變量作為整型處理;-r表明變量為只度;用“+”代替“-”,原有變量的聲明屏蔽,恢復為無定義狀態。由第一次賦值決定其參數在腳本中的性質,如果首次是字符,以都當字符處理,其它等同。
  2. local聲明局部變量;local 變量名 [ = “值”];一般在函數內部運用。
  3. 直接定義變量,不用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

…………

………

………

………

…………

else

continue

fi

done

cd .. à 退出腳本三級工作目錄,進入腳本二級工作目錄

else

continue

fi

done

cd ..à 退出腳本二級工作目錄,進入腳本一級工作目錄

else

continue

fi

done

}

#{

test的用法說明:在腳本裡,用一對[ ]表示test,如[ "$#" -eq "0" ]。注意:參數與[]之間一定要有空格(最好是所有的參數之間都要有空格)。如果不了解test參數的用法,運行man test,只要你學過英語你一定能看懂;實在沒有辦法,那就上網去查吧!

}#

##main shell

if [ "$#" -eq "0" ];then

echo "`echo -e "\033[40;33m"`run fstrf -h or man fstrf `echo -e "\033[40;37m"`to get more help informations."

echo "`echo -e "\033[40;36m"`list current directory:`echo -e "\033[40;37m"`"

ls ./

echo "`echo -e "\033[40;36m"`no string input!!!`echo -e "\033[40;37m"`"

exit

fi

hel_ver $ALL à 調用hel_ver函數

if [ "$1" = "-up" ];then à 查找指定當前目錄內及字目錄內的文件

if [ "$#" -eq "3" ];then

fdir $2 $3 2>/dev/null 1>&2 à 將所有的錯誤輸出均輸向/dev/null(不在屏幕上回顯,以下一樣)

#{

while read var do .. done的重定向說明:

有兩種方式: 1. while read var do .. done < 重定向文件的路徑及文件名

while read var

do

..

done < 重定向文件的路徑及文件名

2. dd if=重定向文件的路徑及文件名 bs=512 2>/dev/null | while read var do .. done

dd if=重定向文件的路徑及文件名 bs=512 2>/dev/null | \

while read var

do

..

done

}#

#{

關函數調用的說明:

在腳本中函數的調用類似與LINUX命令的調用,只是變量要用“”括起來。函數內部的$n只相對與函數的參數位置,如find_offer "$DIR" "$3",find_offer內的$1對應"$DIR",$2對應"$3",與SHELL 主程序的$n無對應關系,既函數的$1不一定要等SHELL主程序的$1。

}#

dd if=/tmp/dtmp bs=512 2>/dev/null | \

while read DIR

do

find_offer "$DIR" "$3"

done

# print_num "$2" "$3"

fi

if [ "$#" -eq "2" ];then à 查找指定當前工作目錄內及字其目錄內的文件

fdir ./ 2>/dev/null 1>&2

dd if=/tmp/dtmp bs=512 2>/dev/null | \

while read DIR

do

find_offer "$DIR" "$2"

done

# print_num "$2"

fi

fi

if [ "$1" = "-cu" ];then à 查找當前目錄或指定當前目錄內的文件

if [ "$#" -eq "2" ];then à 查找當前目錄匹配的文件

find_curr "$2"

print_num "$2" à 顯示匹配的文件數

fi

if [ "$#" -eq "3" ];then à 查找指定當前目錄內的文件

find_offer "$2" "$3"

print_num "$3" à 顯示匹配的文件數

fi

fi

if [ -e /tmp/dtmp ];then à 文件存在則刪除

rm /tmp/dtmp

fi


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Bash中對變量的操作 (2001-10-29 07:00:00)
Bash中的特殊字符 (2001-10-28 13:05:01)
Bash中的變量 (2001-10-28 09:05:00)
Bash最常見的激活模式 (2001-10-28 08:05:00)
如何在bash裡設置用戶提示符 (2001-06-23 12:05:00)
幾個最有用的bash基本命令 (2001-06-23 08:05:01)
如何在bash下使用中文 (2001-06-12 12:10:00)
Linux程式設計-11.Shell Script(bash)--(18)語法 (2001-05-26 09:04:00)
Linux程式設計-11.Shell Script(bash)--(17)重導Redirection (2001-05-26 08:10:00)
Linux程式設計-11.Shell Script(bash)--(16)算術表述 (2001-05-26 07:00:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★