《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站长网)
|