zsh shell 是由 Paul Falstad 开发的开源 Unix shell,吸取了现有的 Shell 的设计理念,增加了许多独特的特性,是为程序员设计的一款无所不能的高级 Shell。

模块

zmodload 命令是 zsh 模块的管理接口。不加任何参数的 zmodload 命令会显示 zsh shell 中安装的模块:

1
2
3
4
5
6
7
8
9
10
11
12
> zmodload
zsh/complete
zsh/complist
zsh/datetime
zsh/langinfo
zsh/main
zsh/parameter
zsh/regex
zsh/stat
zsh/terminfo
zsh/zle
zsh/zutil

不同的 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
2
3
4
5
> let value1=" 4*4.3-1.24"
> echo $value1
15.9600000000
$ printf "%6.3f\n" $value1
15.960

第二种写法是使用 (())

1
2
3
4
5
> value1=$((4 * 5.1))
> ((value2 = 4 * 5.1))
> printf "%6.3f\n" $value1 $value2
20.400
20.400

数学函数

默认的 zsh 并没有包含数学函数,可以安装 zsh/mathfunc,那么你拥有的数学函数绝对比需要的多:

1
2
3
4
> zmodload zsh/mathfunc
> value1=$(( sqrt(9) ))
> echo $value1
3.

结构化命令

  • if-then-else
  • for 循环
  • while
  • until
  • select
  • case

函数

支持使用 function 命令创建自定义函数。

实例

zsh shell 的 tcp 模块尤为实用。该模块允许创建 TCP 套接字,侦听传入的连接,然后与远程系统建立连接。这是在 shell 脚本之间传输数据的绝佳方式。

1
2
3
4
> zmodload zsh/net/tcp
> ztcp -l 8000
> listen=$REPLY
> ztcp -a $listen

-l 选项指定了监听的端口,$REPLY 变量包含与网络套接字相关的文件句柄。ztcp-a 选项会一直等待传入连接建立完毕。

打开一个新的 shell 窗口作为客户端:

1
2
3
4
> zmodload zsh/net/tcp
> ztcp localhost 8000
> remote=$REPLY
> print 'This is a test message' >&$remote

可以使用 read 命令接收发送到 $remote 连接句柄的数据。

1
> read -r data <&$remote; print -r $data

结束服务器可以使用 -c 命令:

1
2
> ztcp -c $listen
> ztcp -c $remote

结束客户端可以使用:

1
> ztcp -c $remote 

参考资料

  1. [美] 理查德·布卢姆,[美] 克里斯蒂娜·布雷斯纳汉著,门佳译.Linux 命令行与 shell 脚本编程大全(第 4 版).人民邮电出版社.2022
  2. zsh 文档地址

小结

zsh shell 多见于编程环境中,因为它为 shell 脚本程序员提供了大量的实用功能。zsh shell 使用可加载模块来载入独立的代码库,这使得使得高级函数就像在命令行中运行命令一样简单。从复杂的数学算法到网络应用(比如 FTP 和 HTTP),可加载模块支持各种各样的功能。