电脑技术学习

对话 UNIX: 更多 shell 脚本技术

dn001

  这个脚本看起来很糟糕!(谢天谢地,它只是一个示例)。这个脚本应该尽可能进行浓缩。从便于阅读的角度来看,清单 2 提供的版本更干净。

  清单 2. 对清单 1 脚本进行浓缩的版本

#!/usr/bin/ksh
exit_msg() {
 [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}"
 exit ${1:-0}
}
[[ $# -lt 2 ]] && exit_msg 0 "Usage: ${0##*/} <file name #1> <file name #2>
for _FNAME in $@
do
 [[ ! -f "${_FNAME}" ]] && exit_msg 1 "Unable to find file '${_FNAME}'"
 [[ ! -r "${_FNAME}" ]] && exit_msg 2 "Unable to read file '${_FNAME}'"
 gzip ${_FNAME}
 ls -l ${_FNAME}.gz
done

  注意到这两者的差异了吗?这个脚本增加了一个简单的函数来显示一个消息并带适当的返回码退出,还把所有操作转移到一个 for 循环中,这使这个脚本看起来更干净、更容易理解了。

  保持灵活性

  编程和 shell 脚本编程的新手常常犯的另一个错误是,在程序或 shell 脚本中对静态值进行硬编码。这会限制脚本的灵活性,是一种糟糕的编程习惯。这迫使管理员或开发人员不得不经常修改脚本以使用其他值;为了避免这个问题,应该使用变量并为脚本或函数提供参数。

  例如,清单 3 是一个编写得很差的不灵活的示例脚本。

  清单 3. 不灵活的示例脚本

#!/bin/bash
if [[ -f /home/cormany/FileA ]]
then
 echo "Found file '/home/cormany/FileA'"
elif [[ -f /home/cormany/DirA/FileA ]]
then
 echo "Found file '/home/cormany/DirA/FileA'"
else
 echo "Unable to find file FileA"
fi

标签: