[转载]Bourne Shell及shell编程 八
时间:2005-11-26 来源:ghostzhu
版权声明:
本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行
任何商业性或赢利性活动。转载时请保留本版权声明。
作者:何斌武,[email protected],大连理工大学网络中心,April 1999.
[请点击阅读全文]
——by ghostzhu
7. 尝试提供"usage"反馈
脚本中使用 "usage" 语句是个好主意,它用来说明如何使用脚本。
代码:
# ----------------------------
# Subroutine to echo the usage
# ----------------------------
usage()
{
echo "USAGE: $CALLER [-h] [-s]"
echo "WHERE: -h = help "
echo " -s = silent (no prompts)"
echo "PREREQUISITES:"
echo "* The environment variable TEST_VAR must be set,"
echo "* such as: "
echo " export TEST_VAR=1"
echo "$CALLER: exiting now with rc=1."
exit 1
}
调用脚本时,使用"-h"标志可以调用 "usage" 语句,如下所示:
./test-bucket-1 -h
8. 尝试使用"安静"的运行模式
您或许想让脚本有两种运行模式:
在 "verbose" 模式(您也许想将此作为缺省值)中提示用户输入值,或者只需按下 Ente
r 继续运行。
在 "silent" 模式中将不提示用户输入数据。
下列摘录说明了在安静模式下运用所调用标志 "-s" 来运行脚本:
代码:
# -------------------------------------------------
# Everything seems OK, prompt for confirmation
# -------------------------------------------------
if [ "$SILENT" = "yes" ]
then
RESPONSE="y"
else
echo "The $CALLER will be performed."
echo "Do you wish to proceed [y or n]? "
read RESPONSE # Wait for response
[ -z "$RESPONSE" ] && RESPONSE="n"
fi
case "$RESPONSE" in
[yY]|[yY][eE]|[yY][eE][sS])
;;
*)
echo "$CALLER terminated with rc=1."
exit 1
;;
esac
9. 当出现错误时,提供一个函数终止脚本
遇到严重错误时,提供一个中心函数以终止运行的脚本不失为一个好主意。此函数还可提
供附加的说明,用于指导在此情况下应做些什么:
代码:
# ----------------------------------
# Subroutine to terminate abnormally
# ----------------------------------
terminate()
{
echo "The execution of $CALLER was not successful."
echo "$CALLER terminated, exiting now with rc=1."
dateTest=`date`
echo "End of testing at: $dateTest"
echo ""
exit 1
}
10. 如有可能,提供可以执行简单任务的函数
例如,不使用许多很长的行命令,如:
代码:
# --------------------------------------------------
echo ""
echo "Creating Access lists..."
# --------------------------------------------------
Access -create -component Development -login ted -authority plead -verbose
if [ $? -ne 0 ]
then
echo "ERROR found in Access -create -component Development -login ted
-authority plead"
let "errorCounter = errorCounter + 1"
fi
Access -create -component Development -login pat -authority general -verbose
if [ $? -ne 0 ]
then
echo "ERROR found in Access -create -component Development -login pat
-authority general"
let "errorCounter = errorCounter + 1"
fi
Access -create -component Development -login jim -authority general -verbose
if [ $? -ne 0 ]
then
echo "ERROR found in Access -create -component Development -login jim
-authority general"
let "errorCounter = errorCounter + 1"
fi
……而是创建一个如下所示的函数,此函数也可以处理返回码,如果有必要,还可以增加
错误计数器:
代码:
CreateAccess()
{
Access -create -component $1 -login $2 -authority $3 -verbose
if [ $? -ne 0 ]
then
echo "ERROR found in Access -create -component $1 -login $2 -authority $3"
let "errorCounter = errorCounter + 1"
fi
}
……然后,以易读和易扩展的方式调用此函数:
代码:
# -------------------------------------------
echo ""
echo "Creating Access lists..."
# -------------------------------------------
CreateAccess Development ted projectlead
CreateAccess Development pat general
CreateAccess Development jim general
11. 当显示正在生成的输出时,捕获每个脚本的输出
如果脚本不能自动地将输出发送到文件的话,可以利用 Bash shell 的一些函数来捕获所
执行脚本的输出,如:
./test-bucket-1 -s 2>&1 | tee test-bucket-1.out
让我们来分析上面的命令:
"2>&1" 命令:
使用 "2>&1" 将标准错误重定向到标准输出。字符串 "2>&1" 表明任何错误都应送到标准
输出,即 UNIX/Linux 下 2 的文件标识代表标准错误,而 1 的文件标识代表标准输出。
如果不用此字符串,那么所捕捉到的仅仅是正确的信息,错误信息会被忽略。
管道 "|" 和 "tee" 命令:
UNIX/Linux 进程和简单的管道概念很相似。既然这样,可以做一个管道将期望脚本的输出
作为管道的输入。下一个要决定的是如何处理管道所输出的内容。在这种情况下,我们会
将它捕获到输出文件中,在此示例中将之称为 "test-bucket-1.out"。
但是,除了要捕获到输出结果外,我们还想监视脚本运行时产生的输出。为达到此目的,
我们连接允许两件事同时进行的 "tee" (T- 形管道):将输出结果放在文件中同时将输
出结果显示在屏幕上。 其管道类似于:
代码:
process --> T ---> output file
|
V
screen
如果只想捕获输出结果而不想在屏幕上看到输出结果,那可以忽略多余的管道: ./test-
bucket-1 -s 2>&1 > test-bucket-1.out
假若这样,相类似的管道如下:
process --> output file