### 导读 习惯写 bash 的开发者容易将 bash 下的用法用在 zsh 上,虽然多数情况并不会产生错误,但往往会多做很多不必要的工作,让脚本显得更臃肿或难以理解。 ### Bash 和 zsh 用法简明对照表 | Bash 用法 | Zsh 用法 | 说明 | | ---------------------- | --------------------- | ---------------------------------- | | `"$var"` | `$var` | 避免变量中有空格导致异常 | | `"$@"` | `$*` | 避免变量中有空格导致异常 | | `"${array[@]}"` | `$array` | 取数组所有元素,`@` 可改成 `*` | | `"${#array[@]}"` | `$#array` | 取数组中元素个数,`@` 可改成 `*` | | `"${array[n - 1]}"` | `$array[n]` | 取数组第 n 个元素,bash 从 0 开始,zsh 从 1 开始 | | `"$array"` | `$array[1]` | Bash 中的 `$array` 是取数组的第一个元素 | | `echo a*b` | `echo "a*b"` | Zsh 默认配置中,通配符如果匹配不到文件会报错 | | `if true; then :; fi` | `if true {}` | Zsh 中不需要使用 `:` 作为空语句 | | `[ "$var" == value ]` | `[[ $var == value ]]` | Zsh 中的 `[ ]` 里不支持 `==`,一律用 `[[ ]]` | | `ls \| tee file \| less` | `ls > file \| less` | Zsh 中不需要用 `tee` 即可实现相同功能 | ### 总结 本文简单列出了一些 zsh 中已经不再需要的 bash 用法,以及 zsh 和 bash 行为不一致的用法。待补充。