用shell简单实现类似git的子命令


git的子命令指的是类似git add,git commit这种。从命令上看git会对不同的子命令做分发,选择不同的函数/方法/功能,避免一堆的git-add git-commit暴露出来。

如果要实现类似功能,简单的就是根据$1选择不同的函数,额外要考虑的是没有输入啊和没有对应功能的情况。其次,对于子命令来说,同样希望获取命令行参数,这时就需要shift了。最后稍微整理下,以下是个人的实现版本:

#!/bin/bash

ACTION=$1
if [ "$ACTION" = '' ]; then
  echo 'usage <action> [options]'
  exit
fi

ACTION_FILE=$1.py
if [ -f “$ACTION_FILE" ]; then
  shift
  jython $ACTION_FILE $@
else
  echo "no such action [$ACTION]"
fi

注意一下第一行/bin/bash。如果写的是/bin/sh,不知道为什么shift一直会报错,网上查了下,改成bash是最简单的解决方法。shift后$@就少了原先的第一个参数。
其次脚本中子命令分发是通过调用不同的python脚本实现的,相对简单,对我来说够用了。
最后,脚本会对没有传入子命令和找不到命令报错。