Zsh 开发指南(第一篇 变量和语句)

本文是Zsh开发系列的第一篇,重点介绍Zsh脚本中的变量和语句。文章指出,尽管zsh兼容bash,但直接用bash语法会错过zsh的诸多特性。作者强调了为何选择zsh进行脚本开发,讨论了部署和学习成本,并通过实例展示了zsh脚本的优势。此外,还简要概述了shell脚本语言的用途和重要性,以及zsh的版本和语法约定。
摘要由CSDN通过智能技术生成

导读

网上关于 zsh 的文章有很多,但其中超过 95% 的文章讲如何使用和配置,写如何用 zsh 编程的文章很少,能找到的多数也是只言片语,不成系统。国外有几本讲 zsh 的书,其中也有很多内容是配置、使用、编写补全脚本等等,对编程有用的篇幅占比并不多,而且比较零散不便于查询。至于官方文档?那是让即使有多年编程经验的开发者也会抓狂的神奇存在。可读性极差,而且基本没有例子,不熟悉文档结构和内容的话,很难找到自己想要的东西。但内容覆盖很全面,洋洋洒洒近 500 页,耐心去看总会找到的。还有一份官方“入门”文档,上次更新时间是 2002 年,也要 300 多页,至于可读性,比官网文档要稍微好一些吧,还是有一定的参考价值的。官网上还有一些链接,里边内容比较零散,也可以看看。

很多人在 zsh 中用 bash 语法写脚本,虽然也可以正常运行,但这样无法利用 zsh 的众多优秀特性,还是非常遗憾的。熟悉下 zsh 下独有的特性,对写脚本的帮助是很大的。

本系列文章无关 zsh 的安装、使用、配置(如果需要配置文件,可以参考我的 .zshrc,里边有比较详细的注释),更无 oh-my-zsh 相关内容,安装 zsh 后无需配置即可开始学习编写脚本。读者不需要有 bash 的基础(最好了解一些),但需要接触过任何一门编程语言,对编程的一些基础概念要有了解。

为什么用 zsh 写脚本

很多人对 zsh 的了解停留在界面漂亮、主题多、插件多、补全强等等,而对 zsh 的语言特性了解并不多。因为 zsh 基本兼容 bash,不少人使用 bash 语法写 zsh 脚本,或者偶尔使用一些 zsh 特有的小技巧,很难体会出 zsh 作为一门编程语言的强大之处。

另外有些人认为 bash 几乎在所有类 Unix 系统都有默认安装,而 zsh 往往要自己安装,为了通用性而用 bash 写脚本比较好。这个说法也有一定的道理,但并不是对所有开发者来说都有影响。如果是开源软件的开发者,为了避免洁癖用户因为不想安装他用不到的 zsh 而不使用自己的软件,而避免使用 zsh,是有一定道理的(但现在 zsh 的用户量也有一定的积累了)。除此之外,自己平时写脚本、公司内部使用等多数场景,都是不需要考虑这个因素的。

如果在公司使用,还涉及其他因素。

第一个是 zsh 的部署成本。但因为多数情况都需要部署其他软件,甚至自己的脚本可以和 zsh 打包部署(去掉用不到的文件后的 zsh 只有 1M 多),所以基本不成问题。而且如果使用系统默认的 bash 的话,还涉及版本不同导致的问题,比如不同系统的 bash 版本不一样,或者系统升级后,bash 的升级导致之前的脚本挂掉等等。所以即使使用 bash,最好也是统一部署或者自带一个特定的版本,而不是使用系统默认的,以减少不必要的麻烦。

第二个就是非常重要的学习成本。因为会写 bash 的人很多,但会写 zsh 的比较少,如果只有自己会写,那么和别人合作会出问题。但 zsh 的学习成本并没有那么大,尤其是对会 bash 开发者来说,要大致看懂 zsh 脚本基本只需要几十分钟的学习,而编写的话,循序渐进也是很自然的事情,而且想不起来的时候还可以用 bash 的语法写。所以学习成本没有那么可观。

第三个是使用 zsh 开发的好处。如果 zsh 和 bash 相比,没有明显的好处,为什么要学习和使用它呢?那么就要从 bash 痛点讲起了。我想经常写 bash 脚本的人,很少有人会举大拇指说 bash 真好用啊。相反,我曾经多次听某些开发者说我写过一个超过 2000(或者其他行数)行的 shell(bash)脚本。但几乎没有人会认为写一个超过 2000 行的 Python 脚本是一件多么特别的事情。蹩脚的语法(几乎所有从任何其他语言迁移过来的开发者,都要重新熟悉和习惯它的语法)、严重依赖外部命令(因为文件系统错误等问题,挂掉一个外部命令,脚本就休克了。命令版本不同会有用法上的微秒差别,调试测试困难。频繁起新进程性能低下)、功能孱弱蹩脚(很多需要频繁使用的功能不全面或者不好用,比如字符串处理和数组的用法)等等,让很多开发者非常头疼,其中有些人甚至主张禁止使用 shell 脚本,一律改用 Python 等等,但 Python 并非适用所有场景,而且也有另外的一些问题,这样做也是因噎废食。Zsh 并非将这些问题全部解决了,但和 bash 相比,有很大的改善。比如 zsh 支持多种风格的语法,开发者很容易找到亲切感;对外部命令的依赖比 bash 要轻很多,多数常用的功能不需要使用外部命令,性能更好,调试也更加方便;功能上和 bash 相比也有比较大的提升,处理不那么复杂的场景已经比较够用了。

有人可能会说,不如“一步到位”,使用 Powershell。Powershell 的确比 Python 更适合作为一种 shell 脚本语言,但使用它的话会有其他问题。

首先 Powershell 的学习成本是绝对要比 zsh 高的,如果想省点事,这并不是好的选择。

其次 Linux 下的 Powershell 目前还是 beta 版,以后会不会有很多人用也很难说,如果很少有人用,那么生态环境就成问题。比如遇到问题后找不到解决办法,配套的软件和库不完善等等。

再次 Powershell 解释器的启动速度非常感人,在我的机器上,Windows 下的 Powershell 空脚本要执行将近 200 毫秒,Linux 下的要更长一些(我只在 WSL 里安装试用过,时间翻了几倍),而 zsh 的话,在 Linux 下不超过 5 毫秒,在 WSL 下也不超过 20 毫秒。如果写一个简单的脚本,运行时都要卡一下,是非常影响体验的。

最后如果平时就使用 Powershell 作为交互 shell,那么虽然脚本的启动时间问题有所缓解,但用户体验会差很多,而且以后也很难提升上来,很容易得不偿失。

Zsh 脚本样例

可以通过一个例子直观感受下用 zsh 写的脚本。这是一个删除当前目录以及所有子目录下重复文件的脚本,通过 md5 判断文件是否相同(不严谨)。熟悉 bash 的读者可以尝试用 bash 完成相同的功能,然后对比一下代码(我之前写过一个 bash 版本的,不贴上来了),就能比较直观地感受到 b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值