您应该发现该 Shell 脚本很容易理解,尽管其中存在一些之前尚未讨论过的新内容。让我们探讨一下那些新内容,然后查看整个脚本。
当 Shell 运行某个命令(如 cp 或 ls)时,它会为该命令产生一个新进程,然后在继续之前等待该(子)进程完成。exec 命令还启动另外一个命令,但是与产生新进程不同,exec 使用一个新命令来“替换当前进程——即 Shell 进程——的任务。换句话说,exec 重用同一进程来启动一个新任务。在该脚本的上下文中,exec 立即“终止该脚本并启动指定的任务。
Unix 实用程序 getopt 扫描位置参数以获得您指定的命名参数。这里,dfiPRrvw 列表查找 -d、-f、-i、-P、-R、-r、-v 和 -w。如果出现别的选项,则 getopt 将会失败。否则,getopt 返回一个以特殊字符串 -- 结尾的选项字符串。
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。
标签: