背景
在日常的工作、生活中,时常会遇到一些需要重复劳动的情况,
而每当遇到这种情况,我都会考虑,如何“一劳永逸”的解决它们~
例如平时在开发过程中的这些场景:
-
iOS开发时,每次新建类,都要添加模板代码 ——
Xcode - Snippets -
Flutter 开发时,对于构建类似UI/功能,也需要编写大串雷同的代码 ——
AS - Live Templates -
在NA开发完成后需要打包提测,而打包 本身是一件耗时 且占用大量CUP的事情 —— 流水线 + 打包脚本
与此同时,也顺便解决了打包前后,一系列的重复、复杂的操作
-
Flutter 开发时,每次添加新的页面模块,都要创建一组 有相同基本功能的类 ——
Flutter page generator -
......
不难发现,对于简单的操作,IDE通常会提供工具来解决,
但对于复杂的、自定义的操作,开发命令行工具 无疑可以更高效的解决,
因此,我们也非常有必要,了解命令行工具的开发~~
常见的参数格式
类似 find 的系统风格
find ./ -maxdepth 1 -type d ! -name "hhh"
find ./test -path "test/test4" -prune -o -print
类似xcodebuild 的分离可选参数风格
xcodebuild -workspace Example.xcworkspace -scheme Example -sdk iphoneos -configuration Release clean archive -archivePath "~/Desktop/Archive"
类似 git 的命令风格
git commt -m "commit something"
git push origin master
常用的开发语言
以下仅代表个人意见
| 系统自带,无需安装 | 跨平台 | 技术迁移性 | 易上手 | 开发效率高、体验好 | 执行效率高 | |
|---|---|---|---|---|---|---|
| php | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| shell | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
| Python | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Dart | ❌ | ✅ | ❌ | (没用过) | (没用过) | (没用过) |
PHP
命令行参数的解析
<?php
/**
* test.php
*/
$argv_count = count($argv);
echo "\n参数 ${argv_count} 个,其中:";
for ($i = 0; $i < $argv_count; $i++) {
$value = $argv[$i];
echo "\n\$argv[$i] = $value";
}
echo "\n\n";
输出:
$ php test.php -d command p1 p2 p3 p4,p5,p6 "p7 p8 p9" --option1 -subOption1 -subOption2 --option2 aaa -subOption1 bbb --option3 "ccc" -subOption1 "ddd" -subOption2 eee "fff ggg"
参数 22 个,其中:
$argv[0] = test.php
$argv[1] = -d
$argv[2] = command
$argv[3] = p1
$argv[4] = p2
$argv[5] = p3
$argv[6] = p4,p5,p6
$argv[7] = p7 p8 p9
$argv[8] = --option1
$argv[9] = -subOption1
$argv[10] = -subOption2
$argv[11] = --option2
$argv[12] = aaa
$argv[13] = -subOption1
$argv[14] = bbb
$argv[15] = --option3
$argv[16] = ccc
$argv[17] = -subOption1
$argv[18] = ddd
$argv[19] = -subOption2
$argv[20] = eee
$argv[21] = fff ggg
完整示例:
markdown_offline_reading.php 是一个Markdown 离线阅读工具,
可以单个或批量的,将Markdown文档中的网络图片下载至本地,并在原文中加载、显示,方便我们离线阅读
执行 Shell 命令
<?php
/**
* test_2.php
*/
$current_path = shell_exec('pwd');
echo "pwd 的执行结果为 $current_path";
输出:
$ php test_2.php
pwd 的执行结果为 /Users/mengxinxin/Desktop
完整示例:
Shell
命令行参数的解析
#!/usr/bin/env bash
# test.sh
echo "\n参数有 1 + $# 个,其中:";
echo "\$0 = $0"
for v in "$@"; do
echo "\$${i:=1} = $v";
i=$((i + 1))
done
输出:
$ sh test.sh -d command p1 p2 p3 p4,p5,p6 "p7 p8 p9" --option1 -subOption1 -subOption2 --option2 aaa -subOption1 bbb --option3 "ccc" -subOption1 "ddd" -subOption2 eee "fff ggg"
参数有 1 + 21 个,其中:
$0 = test.sh
$1 = -d
$2 = command
$3 = p1
$4 = p2
$5 = p3
$6 = p4,p5,p6
$7 = p7 p8 p9
$8 = --option1
$9 = -subOption1
$10 = -subOption2
$11 = --option2
$12 = aaa
$13 = -subOption1
$14 = bbb
$15 = --option3
$16 = ccc
$17 = -subOption1
$18 = ddd
$19 = -subOption2
$20 = eee
$21 = fff ggg
完整示例:
script_tpl.sh 是一个Shell 脚本模板
通过预制常用常量、变量、方法定义,及复杂参数解析,实现快速开发的目的
常用代码
【Shell开发】笔记&技巧:juejin.cn/post/703926…
Python
命令行参数的解析
#!/usr/bin/python3
# test.py
import sys
print("参数 %s 个,其中:" % len(sys.argv))
for i in range(len(sys.argv)): print('sys.argv[%s] = %s' % (i, sys.argv[i]))
输出:
$ python3 test.py -d command p1 p2 p3 p4,p5,p6 "p7 p8 p9" --option1 -subOption1 -subOption2 --option2 aaa -subOption1 bbb --option3 "ccc" -subOption1 "ddd" -subOption2 eee "fff ggg"
参数 22 个,其中:
sys.argv[0] = test.py
sys.argv[1] = -d
sys.argv[2] = command
sys.argv[3] = p1
sys.argv[4] = p2
sys.argv[5] = p3
sys.argv[6] = p4,p5,p6
sys.argv[7] = p7 p8 p9
sys.argv[8] = --option1
sys.argv[9] = -subOption1
sys.argv[10] = -subOption2
sys.argv[11] = --option2
sys.argv[12] = aaa
sys.argv[13] = -subOption1
sys.argv[14] = bbb
sys.argv[15] = --option3
sys.argv[16] = ccc
sys.argv[17] = -subOption1
sys.argv[18] = ddd
sys.argv[19] = -subOption2
sys.argv[20] = eee
sys.argv[21] = fff ggg
完整示例:
python_script_tpl.py 是 Python3 脚本模板,
已预制常用常量、变量、方法定义,及复杂参数解析,以便快速开始核心编程
执行 Shell 命令
#!/usr/bin/python3
# test_2.py
import subprocess
# 获得shell命令执行后的状态status和控制台的所有输出output
shell_command = 'pwd'
(status, output) = subprocess.getstatusoutput(shell_command)
print('执行 shell 命令行的结果为:')
print('status = %s' % (status))
print('output = %s' % (output))
输出:
$ python3 test_2.py
执行 shell 命令行的结果为:
status = 0
output = /Users/mengxinxin/Desktop
彩蛋
在日常的工作、生活中,时常会遇到一些需要重复劳动的情况,
而每当遇到这种情况,我都会考虑,如何“一劳永逸”的解决它们~
—— 本文开头
以上介绍了「通过开发命令行工具 来解决工作中的重复」,
那生活中的重复呢?
—— 请移步: 【效率生活】基于“快捷指令”实现“临期提醒”的创建&查看