Skip to content

Instantly share code, notes, and snippets.

@waylan
Created November 15, 2012 18:39
Show Gist options
  • Star 81 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save waylan/4080362 to your computer and use it in GitHub Desktop.
Save waylan/4080362 to your computer and use it in GitHub Desktop.
Simple bash subcommands. Each subcommand is implemented as a function. For example, `sub_funcname` is called for `funcname` subcommand.
#!/bin/sh
ProgName=$(basename $0)
sub_help(){
echo "Usage: $ProgName <subcommand> [options]\n"
echo "Subcommands:"
echo " bar Do bar"
echo " baz Run baz"
echo ""
echo "For help with each subcommand run:"
echo "$ProgName <subcommand> -h|--help"
echo ""
}
sub_bar(){
echo "Running 'bar' command."
}
sub_baz(){
echo "Running 'baz' command."
echo "First arg is '$1'."
echo "Second arg is '$2'."
}
subcommand=$1
case $subcommand in
"" | "-h" | "--help")
sub_help
;;
*)
shift
sub_${subcommand} $@
if [ $? = 127 ]; then
echo "Error: '$subcommand' is not a known subcommand." >&2
echo " Run '$ProgName --help' for a list of known subcommands." >&2
exit 1
fi
;;
esac
@stephen304
Copy link

I made a thing based on this that I am using so I can create multiple base commands with sub commands without duplicating the logic code.

The idea is that you make a main file in path (~/bin) with the name of the command, then you define sub_* functions, then source the runsub file. That way, if I make more base commands with sub commands, they're organized by file and use the same logic code in runsub:

https://github.com/Stephen304/dotfiles/blob/master/bin/stephen304
https://github.com/Stephen304/dotfiles/blob/master/bin/lib/runsub

@igenyar
Copy link

igenyar commented Aug 18, 2023

should list all subcommands under case
directly running subcommand without any checking may seem cute but definitely dangerous

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment