zsh shell 脚本编程
zsh shell 是由 Paul Falstad 开发的开源 Unix shell,吸取了现有的 Shell 的设计理念,增加了许多独特的特性,是为程序员设计的一款无所不能的高级 Shell。
模块
zmodload
命令是 zsh 模块的管理接口。不加任何参数的 zmodload
命令会显示 zsh shell 中安装的模块:
1 | zmodload |
不同的 zsh 实现在默认情况下可能包含了不同的模块。要添加新模块,只需要在 zmodload 命令行中添加指定的模块名称:
1 | zmodload zsh/net/tcp |
没有显示信息就证明加载成功。再运行 zmodload
就应该可以看到出现在已安装的模块中。
将
zmodload
放入$HOME/.zshrc
是常见的做法,这样就可以自动加载模块。
比较流行的附加模块
模块 | 描述 |
---|---|
zsh/datetime |
附加的日期和时间命令及变量 |
zsh/files |
基础的文件处理命令 |
zsh/mapfile |
通过关联数组来访问外部文件 |
zsh/mathfunc |
附加的科学函数 |
zsh/pcre |
扩展正则表达式库 |
zsh/net/socket |
Unix 域套接字支持 |
zsh/stat |
访问 stat 系统调用来提供系统的统计状况 |
zsh/system |
包括底层系统功能的接口 |
zsh/net/tcp |
访问 TCP 套接字 |
zsh/zftp |
FTP 客户端命令 |
zsh/zselect |
阻塞,直到文件描述符就绪才返回 |
zsh/zutil |
各种实用的 shell 工具 |
脚本编程
zsh shell 的主要目的是为了程序员提供一个高级编程环境。
数学运算
let
命令- 双圆括号
1 | let value1=" 4*4.3-1.24" |
第二种写法是使用 (())
:
1 | value1=$((4 * 5.1)) |
数学函数
默认的 zsh 并没有包含数学函数,可以安装 zsh/mathfunc
,那么你拥有的数学函数绝对比需要的多:
1 | zmodload zsh/mathfunc |
结构化命令
if-then-else
for
循环while
until
select
case
函数
支持使用 function
命令创建自定义函数。
实例
zsh shell 的 tcp 模块尤为实用。该模块允许创建 TCP 套接字,侦听传入的连接,然后与远程系统建立连接。这是在 shell 脚本之间传输数据的绝佳方式。
1 | zmodload zsh/net/tcp |
-l
选项指定了监听的端口,$REPLY
变量包含与网络套接字相关的文件句柄。ztcp
的 -a
选项会一直等待传入连接建立完毕。
打开一个新的 shell 窗口作为客户端:
1 | zmodload zsh/net/tcp |
可以使用 read
命令接收发送到 $remote
连接句柄的数据。
1 | read -r data <&$remote; print -r $data |
结束服务器可以使用 -c
命令:
1 | ztcp -c $listen |
结束客户端可以使用:
1 | ztcp -c $remote |
参考资料
- [美] 理查德·布卢姆,[美] 克里斯蒂娜·布雷斯纳汉著,门佳译.Linux 命令行与 shell 脚本编程大全(第 4 版).人民邮电出版社.2022
- zsh 文档地址
小结
zsh shell 多见于编程环境中,因为它为 shell 脚本程序员提供了大量的实用功能。zsh shell 使用可加载模块来载入独立的代码库,这使得使得高级函数就像在命令行中运行命令一样简单。从复杂的数学算法到网络应用(比如 FTP 和 HTTP),可加载模块支持各种各样的功能。