Gore Liu 6 years ago
parent
commit
1a79dd873a
1 changed files with 114 additions and 0 deletions
  1. 114 0
      19_Zsh-开发指南(第十九篇-脚本实例讲解).md

+ 114 - 0
19_Zsh-开发指南(第十九篇-脚本实例讲解).md

@@ -253,6 +253,120 @@ echo $result
 error
 ```
 
+### 实例六:为带中文汉字数字的文件名重命名成以对应数字开头
+
+功能:见下边例子。
+
+例子:
+
+```
+当前目录有如下文件:
+
+Zsh-开发指南(第一篇-变量和语句).md
+Zsh-开发指南(第七篇-数值计算).md
+Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md
+Zsh-开发指南(第九篇-函数和脚本).md
+Zsh-开发指南(第二篇-字符串处理之常用操作).md
+Zsh-开发指南(第五篇-数组).md
+Zsh-开发指南(第八篇-变量修饰语).md
+Zsh-开发指南(第六篇-哈希表).md
+Zsh-开发指南(第十一篇-变量的进阶内容).md
+Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md
+Zsh-开发指南(第十三篇-管道和重定向).md
+Zsh-开发指南(第十九篇-脚本实例讲解).md
+Zsh-开发指南(第十二篇-[[-]]-的用法).md
+Zsh-开发指南(第十五篇-进程与作业控制).md
+Zsh-开发指南(第十八篇-更多内置模块的用法).md
+Zsh-开发指南(第十六篇-alias-和-eval-的用法).md
+Zsh-开发指南(第十四篇-文件读写).md
+Zsh-开发指南(第十篇-文件查找和批量处理).md
+Zsh-开发指南(第四篇-字符串处理之通配符).md
+
+需要重命名成这样:
+
+01_Zsh-开发指南(第一篇-变量和语句).md
+02_Zsh-开发指南(第二篇-字符串处理之常用操作).md
+03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md
+04_Zsh-开发指南(第四篇-字符串处理之通配符).md
+05_Zsh-开发指南(第五篇-数组).md
+06_Zsh-开发指南(第六篇-哈希表).md
+07_Zsh-开发指南(第七篇-数值计算).md
+08_Zsh-开发指南(第八篇-变量修饰语).md
+09_Zsh-开发指南(第九篇-函数和脚本).md
+10_Zsh-开发指南(第十篇-文件查找和批量处理).md
+11_Zsh-开发指南(第十一篇-变量的进阶内容).md
+12_Zsh-开发指南(第十二篇-[[-]]-的用法).md
+13_Zsh-开发指南(第十三篇-管道和重定向).md
+14_Zsh-开发指南(第十四篇-文件读写).md
+15_Zsh-开发指南(第十五篇-进程与作业控制).md
+16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md
+17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md
+18_Zsh-开发指南(第十八篇-更多内置模块的用法).md
+19_Zsh-开发指南(第十九篇-脚本实例讲解).md
+```
+
+思路:
+
+1. 首先需要写将汉字数字转成阿拉伯数字的函数。
+2. 然后需要从文件名中截取汉字数字,然后转成阿拉伯数字。
+3. 拼接文件名,然后移动文件。
+
+实现:
+
+```
+#!/bin/zsh
+
+# 转换数字的逻辑和上一个实例一样
+
+local -A table=(
+零 0
+一 1
+二 2
+三 3
+四 4
+五 5
+六 6
+七 7
+八 8
+九 9
+)
+
+convert() {
+    local result
+
+    if [[ $1 == 十 ]] {
+        result=一零
+    } elif [[ $1 == 十* ]] {
+        result=${1/十/一}
+    } elif [[ $1 == *十 ]] {
+        result=${1/十/零}
+    } elif [[ $1 == *十* ]] {
+        result=${1/十}
+    } else {
+        result=$1
+    }
+
+    for i ({1..$#result}) {
+        result[i]=$table[$result[i]]
+
+        if [[ -z $result[i] ]] {
+            echo error
+            return 1
+        }
+    }
+
+    echo $result
+}
+
+for i (Zsh*.md) {
+    # -Z 2 是为了在前边补全一个 0
+    # 汉字数字的起始位置是固定的,直接数即可,不固定的话也可以用去除法
+    # 汉字数字的终止位置不固定,直接把“篇”以后的内容全去除
+    local -Z 2 num=$(convert ${i[11,-1]/%篇*})
+    mv -v $i ${num}_$i
+}
+```
+
 ### 总结
 
 本文讲解了几个简单的 zsh 脚本,后续可能会补充更多个。