设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

9个函数示例,让你重新认识Shell

发布时间:2021-01-04 10:33 所属栏目:53 来源:网络整理
导读:《9个函数示例,让你重新认识Shell》要点: 本文介绍了9个函数示例,让你重新认识Shell,希望对您有用。如果有疑问,可以联系我们。 一、测试目录存在 拷贝文件时,测试目录是否存在是常见的工作之一.以下函数测试传递给函数的文件名是否是一个目录.因为此函

《9个函数示例,让你重新认识Shell》要点:
本文介绍了9个函数示例,让你重新认识Shell,希望对您有用。如果有疑问,可以联系我们。

一、测试目录存在

拷贝文件时,测试目录是否存在是常见的工作之一.以下函数测试传递给函数的文件名是否是一个目录.因为此函数返回时带有成功或失败取值,可用if语句测试结果.函数如下:

is_it_a_directory()
{
 ? ? ? ?# is_it_a_directory
 ? ? ? ?# to call: is_it_a_directory directory_name
 ? ? ? ?if [ $# -lt 1 ]; then
 ? ? ? ? ? ? ? ?echo "is_it_a_directory: I need an argument"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?# is it a directory ?
 ? ? ? ?_DIRECTORY_NAME=$1
 ? ? ? ?if [ ! -d $_DIRECTORY_NAME ]; then
 ? ? ? ? ? ? ? ?# no it is not
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?else ? ?
 ? ? ? ? ? ? ? ?# yes it is
 ? ? ? ? ? ? ? ?return 0
 ? ? ? ?fi ? ? ?
}

要调用函数并测试结果,可以使用:

echo -n "Enter destination directory :"
read DIREC
if is_it_a_directory $dires; 
then : ?
else ? ?
 ? ? ? ?echo "$DIREC does no exist,create it now ? [y..]"
 ? ? ? ?# commands go here to either create the directory or exit
 ? ? ? ?...
 ? ? ? ?...
fi

二、提示Y或N

许多脚本在继续处理前会发出提示.大约可以提示以下动作:

? 创建一个目录.
? 是否删除文件.
? 是否后台运行.
? 确认保存记录.
等等

以下函数是一个真正的提示函数,提供了显示信息及缺省回答方式.缺省回答即用户按下回车键时采取的动作.case语句用于捕获回答:

continue_prompt()
# continue_prompt
# to call: continue_prompt "string to display" default_answer
{
 ? ? ? ?_STR=$1
 ? ? ? ?_DEFAULT=$2
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -lt 1 ]; then
 ? ? ? ? ? ? ? ?echo "continue_prompt: I need a string to display"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?# loop forever
 ? ? ? ?while :
 ? ? ? ?do ? ? ?
 ? ? ? ? ? ? ? ?echo -n "$_STR [Y..N] [$_DEFAULT]:"
 ? ? ? ? ? ? ? ?read _ANS
 ? ? ? ? ? ? ? ?# if user hits return set the default and determine the return
 ? ? ? ? ? ? ? ?# value,that's s: then a <space> then $
 ? ? ? ? ? ? ? ?: ${_ANS:=$_DEFAULT}
 ? ? ? ? ? ? ? ?if [ "$_ANS" == "" ]; then
 ? ? ? ? ? ? ? ? ? ? ? ?case $_ANS in
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Y) return 0;;
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N) return 1;;
 ? ? ? ? ? ? ? ? ? ? ? ?esac ? ?
 ? ? ? ? ? ? ? ?fi ? ? ?
 ? ? ? ? ? ? ? ?# user has selected something
 ? ? ? ? ? ? ? ?case $_ANS in
 ? ? ? ? ? ? ? ? ? ? ? ?y|Y|Yes|YES) return 0
 ? ? ? ? ? ? ? ? ? ? ? ?;;
 ? ? ? ? ? ? ? ? ? ? ? ?n|N|No|NO) return 1
 ? ? ? ? ? ? ? ? ? ? ? ?;;
 ? ? ? ? ? ? ? ? ? ? ? ?*) echo "Answer either Y or N,default is $_DEFAULT"
 ? ? ? ? ? ? ? ? ? ? ? ?;;
 ? ? ? ? ? ? ? ?esac ? ?
 ? ? ? ? ? ? ? ?echo $_ANS
 ? ? ? ?done ? ?
}

要调用上述函数,须给出显示信息或参数$1,或字符串变量.缺省回答Y或N方式也必须指定.以下是几种函数continueprompt的调用格式

if continue_prompt "Do you want to delete the var filesystem" "N"; then
 ? ? ? ?echo "Are you nuts!!"
else ? ?
 ? ? ? ?echo "Phew ! what a good answer"
fi

在脚本中加入上述语句,给出下列输入:

Do you want to delete the var filesystem [Y..N] [N]:
Phew ! what a good answer
Do you want to delete the var filesystem [Y..N] [N]:y
Are you nuts!!

以下是函数调用的另一种方式:

if continue_prompt "Do you really want to print this report" "Y"; then
 ? ? ? ?lpr report
else :
fi

也可以使用字符串变量$1调用此函数:

if continue_prompt $1 "Y"; then
 ? ? ? ?lpr report
else: ? 
fi

三、从登录ID号中抽取信息

当所在系统很庞大,要和一登录用户通信时,如果忘了用户的全名,这是很讨厌的事.比如有时你看到用户锁住了一个进程,但是它们的用户ID号对你来说没有意义,因此必须要用grep passwd文件以取得用户全名,然后从中抽取可用信息,向其发信号,让其他用户开锁.以下函数用于从grep /etc/passwd命令抽取用户全名.本系统用户全名位于passwd文件域5中,用户的系统可能不是这样,这时必须改变其域号以匹配passwd文件.这个函数需要一个或多个用户ID号作为参数.它对密码文件进行grep操作.函数脚本如下:

whois()
# whois
# to call: whois userid
{
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -lt 1 ]; then
 ? ? ? ? ? ? ? ?echo "whois : need user id's pleas"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?for loop
 ? ? ? ?do ? ? ?
 ? ? ? ? ? ? ? ?_USER_NAME=`grep $loop /etc/passwd | awk -F: '{print $4}'`
 ? ? ? ? ? ? ? ?if [ "$_USER_NAME" == "" ]; then
 ? ? ? ? ? ? ? ? ? ? ? ?echo "whois: Sorry cannot find $loop"
 ? ? ? ? ? ? ? ?else ? ?
 ? ? ? ? ? ? ? ? ? ? ? ?echo "$loop is $_USER_NAME"
 ? ? ? ? ? ? ? ?fi ? ? ?
 ? ? ? ?done ? ?
}

四、列出文本文件行号

在vi编辑器中,可以列出行号来进行调试,但是如果打印几个带有行号的文件,必须使用nl命令.以下函数用nl命令列出文件行号.原始文件中并不带有行号.

# number_file
# to call: number_file filename
number_file()
{
 ? ? ? ?_FILENAME=$1
 ? ? ? ?# check we have the right params
 ? ? ? ?if [ $# -ne 1 ]; then
 ? ? ? ? ? ? ? ?echo "number_file: I need a filename to number"
 ? ? ? ? ? ? ? ?return 1
 ? ? ? ?fi ? ? ?
 ? ? ? ?loop=1
 ? ? ? ?while read LINE[quote]
 ? ? ? ?do ? ? ?
 ? ? ? ? ? ? ? ?echo "$loop: $LINE"
 ? ? ? ? ? ? ? ?loop=`expr $loop + 1`
 ? ? ? ?done < $_FILENAME
}

要调用numberfile函数,可用一个文件名做参数,或在shell中提供一文件名,例如:

$ number_file myfile

也可以在脚本中这样写或用:

number_file $1

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读