[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 编程技术 > 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)

===更多相关===
 

★  樊强制作 欢迎分享  ★