Gore Liu 6 years ago
parent
commit
3f51f56410

+ 1 - 0
00_Zsh-开发指南(目录).md

@@ -293,6 +293,7 @@
 ### [引号](20_Zsh-开发指南(第二十篇-代码风格).md#引号)
 ### [函数](20_Zsh-开发指南(第二十篇-代码风格).md#函数)
 ### [脚本行数](20_Zsh-开发指南(第二十篇-代码风格).md#脚本行数)
+### [语句风格](20_Zsh-开发指南(第二十篇-代码风格).md#语句风格)
 ### [总结](20_Zsh-开发指南(第二十篇-代码风格).md#总结)
 
 ---

+ 52 - 3
20_Zsh-开发指南(第二十篇-代码风格).md

@@ -96,6 +96,7 @@
 
 - 用 `$var` 取变量值时,两边不加双引号,除非需要将非字符串变量转换成字符串。
 - 在非必须场景,不需要加 `${var}` 中的大括号。
+- 变量使用前要明确指明是局部变量(用 `local` 定义)还是全局变量(用 `typeset -g` 定义)。
 - 能用局部变量的地方全部使用局部变量(用 `local` 定义)。
 - 变量名中的单词可以使用下划线分隔或者驼峰风格,在不影响可读性的情况也可以使用全小写字母,但在同一个文件中要一致。
 
@@ -103,8 +104,9 @@
 
 1. 和 bash 不同,zsh 在使用 `$var` 读取变量内容时,不用因为变量不存在、值为空、包含特殊符号而产生各种逻辑错误,所以无需在两端加双引号。
 2. 用 `$var` 读变量是很多编程语言都有的用法,而 `${var}` 几乎是 shell 中特有的用法,并且输入更麻烦,没必要推广这种用法。而且因为不加大括号导致变量名粘连而出错的情况,编写代码时即可识别出来,和外部输入无关,不需要为了避免不存在的问题而输入很多额外的大括号。
-3. 如果能使用局部变量的地方使用全局变量,更容易出现全局变量重名而互相影响导致错误的情况。这种错误是很难排查的(因为不会产生语法错误,容易让人怀疑是代码逻辑的问题,而不去检查是否有全局变量重名的情况),往往会浪费开发或者测试人员大量的时间。
-4. 不同编程语言的开发者对变量名的风格偏好不同,不宜规定统一风格。
+3. 如果不指明变量是全局变量还是局部变量,默认是全局变量,有时候很难简单地判断一个变量是作为全局变量还是局部变量使用的,这样会给脚本的维护者带来很多麻烦。
+4. 如果能使用局部变量的地方使用全局变量,更容易出现全局变量重名而互相影响导致错误的情况。这种错误是很难排查的(因为不会产生语法错误,容易让人怀疑是代码逻辑的问题,而不去检查是否有全局变量重名的情况),往往会浪费开发或者测试人员大量的时间。
+5. 不同编程语言的开发者对变量名的风格偏好不同,不宜规定统一风格。
 
 ### 引号
 
@@ -134,6 +136,53 @@
 1. 因为 shell 脚本的特性,单个脚本文件过长容易导致各种问题(比如全局变量互相影响)。1000 行代码对于多数场景都够用了。
 2. 如果写的是安装脚本之类需要分发的脚本,那么分发单个文件要比分发多个文件(需要打包解包等额外工作)容易很多,这种场景可能需要写长脚本。所以不宜强行规定单个脚本文件最大行数。
 
+### 语句风格
+
+-   条件、循环、选择等语句,可以使用本系列教程中的风格,也可以使用 POSIX shell 风格,但同一个文件的风格要一致。
+
+原因:
+
+1.  本系列教程的中语句风格简洁易懂,并且和 c、Java、JavaScript 等语言的语句风格相近。
+2.  从 bash 迁移过来的开发者习惯使用 POSIX shell 风格语句,需要兼顾。
+
+本系列教程语句风格实例:
+
+```
+if [[ ... ]] {
+} elif ((...)) {
+} else {
+}
+
+case $i {
+    (a)
+    ...
+    ;;
+
+    (*)
+    ...
+    ;;
+}
+```
+
+POSIX shell 语句风格实例:
+
+```
+if [[ ... ]]; then
+elif ((...)); then
+else
+fi
+
+case $i in
+    (a)
+    ...
+    ;;
+
+    (*)
+    ...
+    ;;
+esac
+```
+
 ### 总结
 
-本文介绍了我建议的 zsh 代码风格,可以适当参考。内容待完善。
+本文介绍了我建议的 zsh 代码风格,可以适当参考。