|
前言:
這裡只介紹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
…………
………
………
………
…………
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論壇】
|