【效率开发】命令行工具开发 简介

335 阅读2分钟

背景

在日常的工作、生活中,时常会遇到一些需要重复劳动的情况,

而每当遇到这种情况,我都会考虑,如何“一劳永逸”的解决它们~

例如平时在开发过程中的这些场景:

  • 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

完整示例:

EasyBoxer 工具

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

彩蛋

在日常的工作、生活中,时常会遇到一些需要重复劳动的情况,

而每当遇到这种情况,我都会考虑,如何“一劳永逸”的解决它们~

—— 本文开头

以上介绍了「通过开发命令行工具 来解决工作中的重复」,

那生活中的重复呢?

—— 请移步: 【效率生活】基于“快捷指令”实现“临期提醒”的创建&查看