内部的 for 循环枚举当前工作目录中的所有文件——通配符 *(星号)匹配所有条目——然后测试每个条目是否为文件。[[ -x $file && ! -d $file ]] || continue 行表示“如果 $file 存在并且是可执行文件而且不是目录,则处理它;否则执行 continue。
最后,如果前面的所有条件都满足,则使用 echo 来显示文件名。
您弄明白该脚本的最后一行了吗?您可以将大多数控制结构的输出发送给另一个 Unix 命令——毕竟,Shell 将该控制结构视为一个命令。因此,整个脚本的输出通过 sort、然后通过 uniq 进行管道传输,以产生在您的 $PATH 中找到的唯一命令的字母排序列表。
如果将清单 4 保存到一个名为 listcmds.zsh 的可执行文件,则输出可能类似如下:
$ ./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 等完整语言中的编程一样丰富。
标签: