$ ./listcmds.zsh
[
a2p
ab
ac
accept
accton
aclocal
short-circuiting 命令在脚本中非常有用 。它在单个命令中组合了条件和操作 。而且由于每个 UNIX 命令都返回一个指示成功或失败的状态代码 , 因此 , 您可以使用任何命令作为“条件——而不仅仅是使用测试操作符 。根据约定 , UNIX 返回零 (0) 表示成功 , 返回非零表示失败 , 其中非零值反映所发生的错误类型 。
例如 , 如果将 [[ -d $Directory ]] || continue 行替换为 cd $directory || continue , 则可以从清单 4 中消除 pushd 和 popd 。如果 cd 命令成功 , 则它会返回 0 , 并且逻辑“或的求值可以立即结束 。然而 , 如果 cd 失败 , 则它会返回非零 , 并且会执行 continue 。
不要删除 。应存档!
现代 UNIX Shell——bash、ksh、zsh——提供了许多控制结构和操作以创建复杂的脚本 。由于您可以调用所有 UNIX 命令来将数据从一种形式处理为另一种形式 , Shell 脚本编程几乎与诸如 C 或 Perl 等完整语言中的编程一样丰富 。
您可以使用脚本来自动化几乎所有个人或系统任务 。脚本可以监视、存档、更新、上载、下载和转换数据 。一个脚本可以只有单行或包括无数个子系统 。任务无论大小 , 均可通过脚本来处理 。实际上 , 如果您查看 /etc/init.d 目录 , 会看到在每次启动计算机时运行服务的各种 Shell 脚本 。如果您创建了一个非常有用的脚本 , 您甚至可以将它部署为系统范围的实用程序 。只需将其放到用户的 $PATH 上的某个目录中 。
让我们创建一个实用程序 , 以练习您新发现的诀窍 。脚本 myrm 将替换系统自己的 rm 实用程序 。与彻底删除某个文件不同 , myrm 把要删除的文件复制到某个存档 , 对其进行唯一命名以便您以后能够找到它 , 然后再删除原始文件 。myrm 脚本有效但是非常简单 , 并且您还可以添加许多杂项功能 。您还可以编写一个广泛的 unrm(撤销删除)脚本作为配套实用程序 。(您可以搜索 Internet 来找到各种各样的实现 。)
myrm 脚本如清单 5 所示 。
清单 5. 用于在从文件系统中删除文件之前备份该文件的简单实用程序
#! /bin/zsh
backupdir=$HOME/.tomb
systemrm=/bin/rm
if [[ -z $1 || $1 == "--help" ]]
then
exec $systemrm
fi
if [[ ! -d $backupdir ]]
then
mkdir -m 0700 $backupdir || echo "$0: Cannot create $backupdir"exit
fi
args$=$( getopt dfiPRrvw $* ) || exec $systemrm
count=0
flags = ""
foreach argument in $args
do
case $argument in
--) break;
;;
*) flags="$flags $argument";
(( count=$count1 ));
;;
esac
done
shift $(( $count ))
for file
do
[[ -e $file ]] || continue
copyfile=$backupdir/$(basename $file).$(date " %m.%d.%y.%H.%M.%S")
/bin/cp -R $file $copyfile
done
exec $systemrm $=flags "$@"
您应该发现该 Shell 脚本很容易理解 , 尽管其中存在一些之前尚未讨论过的新内容 。让我们探讨一下那些新内容 , 然后查看整个脚本 。
当 Shell 运行某个命令(如 cp 或 ls)时 , 它会为该命令产生一个新进程 , 然后在继续之前等待该(子)进程完成 。exec 命令还启动另外一个命令 , 但是与产生新进程不同 , exec 使用一个新命令来“替换当前进程——即 Shell 进程——的任务 。换句话说 , exec 重用同一进程来启动一个新任务 。在该脚本的上下文中 , exec 立即“终止该脚本并启动指定的任务 。
Unix 实用程序 getopt 扫描位置参数以获得您指定的命名参数 。这里 , dfiPRrvw 列表查找 -d、-f、-i、-P、-R、-r、-v 和 -w 。如果出现别的选项 , 则 getopt 将会失败 。否则 , getopt 返回一个以特殊字符串 -- 结尾的选项字符串 。
推荐阅读
- 提升UNIX中文件系统使用效率
- SCO UNIX基础讲座--第十一讲:TCP/IP 管理
- 什么是第二人格
- 基本配置及操作 SCO UNIX学习宝典
- SCOUNIX基础讲座--第八讲:监视进程管理
- Stty使用技巧一则
- SCO UNIX 5.0.4 DAT磁带机安装
- 初识夏新M350——外观第一感
- UNIX操作系统的版本与标准
- UNIX操作系统的历史
