对话 UNIX: 更多 shell 脚本技术( 二 )
if [[ -f "${_DNAME}/${_FNAME}" ]]
then
exit_msg 0 "Found file '${_DNAME}/${_FNAME}'"
else
exit_msg 3 "Unable to find file '${_DNAME}/${_FNAME}'"
fi
这个脚本更灵活,因为它允许用户指定要搜索的任何文件和任何搜索目录 。
提供选项
在编写一个 shell 脚本时,一些用户可能会说,“它真不错! 或者 “我喜欢使用它;而同时,其他用户可能不同意这个评价,他们可能不希望执行相同的操作 。人们喜欢有选择,为什么不给他们提供选项呢?内置的 shell 命令 getopt 可以完成这个任务 。
清单 5 提供一个在 AIX 中使用 getopt 的基本示例 。
清单 5. getopt 示例
#!/usr/bin/ksh
_ARGS=`getopt -o x --long xxxxx -n ${0##*/} -- "$@"`
while [[ $# -gt 0 ]]
do
case "${1}" in
-x|--xxxxx) echo "Arg x hit!"shift;;
--) shift; break;;
*) echo "Invalid Option: ${1}"break;;
esac
done
在执行包含 getopt(称为 opttest)的脚本时,如果在 -x 或 --xxxxx 中使用有效的参数,getopt 会识别出开关并执行 case 开关中的代码:
# ./hm -x
Arg x hit!
下面是使用无效开关或选项时的结果:
# ./hm -a
Invalid Option: -a
文档,文档,文档
我们在职业生涯中早晚会受到这个问题的困扰 。老板要求您看看一个 10 年前编写的脚本,它的作者已经不再为公司工作了 。您会说 “没问题 吗?通常情况下,可能没问题;但是,如果这个脚本很复杂,执行了您不习惯使用的命令,采用的编写风格与您的风格不一样,或者干脆就不能正常工作,您就遇到大麻烦了 。在这种情况下,一些反映作者当初编写这个脚本时的想法的提示会有很大的帮助 。有时候,您开发了一个自认为只使用一次的脚本,但是以后却发现还需要修改它 。或者,您用几星期时间编写了一个巨大的脚本,您了解这个脚本的所有细节,但是如果别人阅读它,却不知所云 。这几种情况说明,文档之于开发人员就像脚本之于用户,都非常重要 。
看看清单 6 所示的函数 。
清单 6. 没有注释的脚本示例
confirm_and_exit() {
[[ ${_DEBUG_LEVEL} -ge 3 ]] && set -x
while [[ -z ${_EXIT_ANS} ]]
do
cup_echo "Are you sure you want to exit? [Y/N]
c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}
${_TPUT_CMD} cnorm
read ${_NO_EOL_FLAG: ${_READ_FLAG:-'-n'}} ${_NO_EOL_FLAG} _EXIT_ANS
${_TPUT_CMD} civis
done
case ${_EXIT_ANS} in
[Nn]) unset _EXIT_ANS; return 0;;
[Yy]) exit_msg 0 1 "Exiting Script";;
*) invalid_selection ${_EXIT_ANS}; unset _EXIT_ANS;;
esac
return 0
}
如果您有比较丰富的 shell 脚本编程经验,可能能够读懂这个脚本 。但是,脚本编程的初学者很难理解这个函数的作用 。如果花上几分钟在这个脚本中添加注释,情况就大不一样了 。清单 7 给出包含注释的同一个函数 。
清单 7. 包含注释的脚本示例
#########################################
# function confirm_and_exit
#########################################
confirm_and_exit() {
# if the debug level is set to 3 or higher, send every evaluated line to stdout
[[ ${_DEBUG_LEVEL} -ge 3 ]] && set –x
# Continue to prompt the user until they provide a valid answer
while [[ -z ${_EXIT_ANS} ]]
do
# prompt user if they want to exit the script
# cup_echo function calls tput cup
# syntax:
# cup_echo
cup_echo "Are you sure you want to exit? [Y/N]
c" ${_PROMPT_ERR_ROW} ${_PROMPT_ERR_COL}
# change cursor to normal via tput
推荐阅读
- 对话 UNIX: !$#@*%
- UNIX 共享内存应用中的问题及解决方法
- 用Syslog 记录UNIX和Windows日志的方法
- 本周五Unix系统将发生时间错误
- 如何在Unix结果中抽取想要的参数
- 同步 UNIX 文件
- /dev/tty文件在Unix操作系统中的妙用
- 有关UNIX启动的一些体会
- NetWare与UNIX的互联方法与实现
- Unix系统下Find命令的三个高级应用