文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[转载]Bourne Shell及shell编程 八

[转载]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

相关阅读 更多 +
排行榜 更多 +
飙车地下城市赛车

飙车地下城市赛车

赛车竞速 下载
爬坡摩托

爬坡摩托

赛车竞速 下载
超速前进赛车传奇

超速前进赛车传奇

赛车竞速 下载