shift 命令从左到右删除位置参数 。例如 , 如果命令行为 myrm, -r -f -P file1 file2 file3 , 则 shift 3 将分别删除 $0、$1 和 $2 , 或 -r、-f 和 -P 。file1、file2 和 file3 将被重新编号为 $0、$1 和 $2 。
case 语句的工作方式与传统编程语言中的对应结构相似 。它将其参数与列表中的每个模式比较;当找到匹配项时 , 则执行对应的代码 。与在 Shell 中非常类似 , * 匹配所有条目 , 并且可用作在未找到其他匹配项时的缺省操作 。
特殊符号 $@ 展开为所有(其余)的位置参数 。
zsh 操作符 $= 在空白边界处拆分单词 。当您有一个非常长的字符串 , 并且希望将该字符串拆分为各个参数时 , $= 是非常有用的 。例如 , 如果变量 x 包含字符串 '-r -f'——这是一个具有五个字符的单词——$=x 将变为两个单独的单词 -r 和 -f 。
给出这些解释之后 , 您现在应该能够详细分析该脚本了 。下面让我们逐块地研究一下该代码:
第一个块设置整个脚本中使用的变量 。
下一个块应该是非常熟悉的:它在未提供参数时打印用法信息 。它为什么执行 (exec) 实际的 rm 实用程序呢?如果您将此脚本命名为“rm并将其放在 $PATH 中靠前的位置 , 则它就可以充当 /bin/rm 的替代者 。该脚本的错误选项也是 /bin/rm 的错误选项 , 因此该脚本允许 /bin/rm 提供用法信息 。
下一个块在备份目录不存在时创建该目录 。如果 mkdir 失败 , 则该脚本终止并显示适当的错误消息 。
下一个块查找位置参数列表中的 dash 参数 。如果 getopt 成功 , 则 $args 具有一个选项列表 。如果 getopt 失败 , 例如在它无法识别某个选项的时候 , 则它会打印错误消息 , 并且该脚本将退出并显示用法信息 。
随后的块捕获一个字符串中旨在提供给 rm 的所有选项 。当遇到特殊 getopt 选项 -- 时 , 选项收集过程停止 。shift 从参数列表中删除所有已处理的参数 , 保留待处理的文件和目录列表 。
从以 for file 开头的块复制每个文件和目录 , 以便在您自己的存档目录中保存它们 。每个文件的目录被逐字 (-R) 复制到存档目录 , 并附带当前日期和时间作为后缀 , 以确保该副本是唯一的 , 并且不会改写以前存档的具有相同名称的条目 。
最后 , 使用传递给该脚本的相同命令行选项来删除文件和目录 。
然而 , 如果您碰巧需要刚才删除(意外删除?)的文件或目录 , 您可以在存档中查找原始副本 。
向自动化进军
【对话 UNIX,第 6 部分: 通过脚本实现操作的自动化】您使用 Unix 的时间越多 , 就越有可能创建脚本 。脚本可以节省重新输入复杂的较长命令序列所需的时间和精力 , 并且还可以防止发生错误 。Web 上充满了其他人已创建的用于许多目的的有用脚本 。很快您也会发布自己的神奇脚本 。
推荐阅读
- 提升UNIX中文件系统使用效率
- SCO UNIX基础讲座--第十一讲:TCP/IP 管理
- 什么是第二人格
- 基本配置及操作 SCO UNIX学习宝典
- SCOUNIX基础讲座--第八讲:监视进程管理
- Stty使用技巧一则
- SCO UNIX 5.0.4 DAT磁带机安装
- 初识夏新M350——外观第一感
- UNIX操作系统的版本与标准
- UNIX操作系统的历史
