Like Thor, but for bash!

Check it out on github

Example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/thorsh"

add_function hello "Says hello"
function hello() {
    echo Hello, World
}
    
add_value type=x11 "Server type"
add_value image=debian-12 "Image name"

add_function create name "Create a new server"
function create() {
    echo Called create
    echo "name   = " ${name}
    echo "type   = " ${type}
    echo "image  = " ${image}
}

thorsh "$@"

Which gives you

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ ./example hello
Hello, World

$ ./example create server_name --image ubuntu
Called create
name   =  server_name
type   =  x11
image  =  ubuntu

$ ./example help
Usage: example [OPTIONS] COMMAND [args]

Commands
     help                  Show the help command
     hello                 Says hello
     create name           Create a new server

Options
     --type=x11            Server type
     --image=debian-12     Image name

Quick Start

1
2
3
4
curl -L https://github.com/wschenk/thorsh/raw/main/thorsh > thorsh 
chmod +x thorsh
thorsh template my_script
vi my_script

thorsh needs to be in the same directory as your script

Usage

1
2
3
4
5
6
7
bash thorsh help
Usage: thorsh [OPTIONS] COMMAND [args]

Commands
     help                  Show the help command
     template name         Create a new script
     inline name           Make a throsh script self-contained

template

To generate a new template file

inline

Merges the thorsh script with the user script, which then is standalone

1
bash thorsh inline example > example.inlined

Why?

I’ve been doing a bunch of server scripting lately, and I want to reach for Thor to help sort out some command options. But its a bit of a pain to get a ruby environment setup, especially in a Docker container where it’s not the primary purpose.

But I missed the simple ways of defining a method with help and then implementing it.

How does it work?

Calling add_flag, add_option and add_function puts stuff into a bunch of bash 3 compatible arrays. Then the thorsh at the end of your script does this:

1
2
3
function thorsh() {
    eval $(generate_options_parser)
}

Which iterates over those arrays creating bash code to generate a while/case loop over all of the input arguments. It sets what needs to be set in the environment and then executes the function in cmd.

Usage

1
thorsh template new_script

add_flag key Usage

For adding single, true/false things. (Either the string “true” or “”)

1
add_flag verbose "Verbose flag"

verbose default to “”.

1
add_flag logging=true "Verbose flag"

add_value key Usage

Adding a 2 parameter value, something like --log_level debug

1
add_value log_level=warn "Logging level (default: warn)

So:

1
example

log_level will be warn

1
example --log_level debug

log_level will be debug

add_function name arg1 arg2 argN “Usage”

Define a function with a varible number of (fixed) arguments.

The basic is

1
2
3
4
add_function hello "Prints hello world"
function hello() {
    echo Yo
}

And the example above

1
2
3
4
5
6
add_function name arg1 arg2 argN "Usage"
function name() {
   echo arg1 = #{arg1}
   echo arg2 = #{arg2}
   echo argN = #{argN}
}

Inspired by

Previously

Should Robots Have Rites or Rights

2023-07-11

Next

Flushing DNS cache on OSX I keep forgetting

2023-07-16

howto

Previously

Emacs Blogging mode take 2 emacs and hugo sitting in a tree

2023-07-02

Next

POSSE rss to mastodon keep it local and then share

2024-03-04