Documentation

    PLEASE NOTE: This document applies to v2.11 version and not to the latest stable release v2.16

    Documentation for other releases can be found by using the version selector in the left bottom of any doc page.

    Parser

    How elements are parsed

    Elements are parsed using usages and automatically added to your context variables. The parsed values are available as JSON objects within your script.

    #!/usr/bin/env rash
    #
    # Usage: ./program [options] (start|stop|restart)
    #
    # Options:
    #   --count=<n>  Number of iterations [default: 1]
    
    - debug:
        msg: "{{ options }}"
    
    - debug:
        msg: "{{ start }}"
    

    Command parsing

    Commands are parsed as false by default and when they are passed they will appear as true:

    {
      "command1": true,
      "command2": false,
      "command3": false
    }
    

    Example: with the usage pattern ./program (start|stop|restart), if you call ./program start, the variables will be:

    {
      "start": true,
      "stop": false,
      "restart": false
    }
    

    Note: Command with dashes are converted to underscores in the resulting JSON. E.g., ./program my-command:

    {
      "my_command": true
    }
    

    Option parsing

    Options are grouped under the options key in the resulting JSON:

    {
      "options": {
        "apply": false,
        "dry_run": false,
        "help": false,
        "number": "10",
        "timeout": null,
        "version": false,
        "q": true
      },
      "port": "443"
    }
    

    In the example above:

    • Boolean options not provided are false
    • Options with values have their string value (like "number": "10")
    • Options without default values that weren’t provided will be null
    • Short options are available with their single-letter key (like "q": true)
    • Options with dashes are converted to underscores in the resulting JSON

    Special case - help: The help option is handled specially. If help is passed as an argument or option, the program will show all documentation and exit with a status code of 0:

    ./program --help   # Shows help text and exits
    ./program help     # Same behavior if 'help' is defined as a command
    

    Default values for options

    When you specify a default value for an option in the options section, that value will be used when the option isn’t explicitly provided in the command line. For example:

    # Options:
    #   --timeout=<seconds>    Connection timeout [default: 30]
    #   --retries=<count>      Number of retry attempts [default: 3]
    

    If your script is invoked without these options, the values in your script would be:

    {
      "options": {
        "timeout": "30", // Default value applied
        "retries": "3" // Default value applied
      }
    }
    

    If you provide a different value in the command line, it overrides the default:

    ./script.rh --timeout=60
    

    Would result in:

    {
      "options": {
        "timeout": "60", // Command-line value overrides default
        "retries": "3" // Default value applied
      }
    }
    

    Positional argument parsing

    Positional arguments are parsed as strings or arrays depending on whether they’re repeatable:

    {
      "argument": "value",
      "repeating_argument": ["value1", "value2", "value3"]
    }
    

    If a positional argument isn’t provided in the command line, it will be omitted from the variables JSON.

    Note: Command with dashes are converted to underscores in the resulting JSON. E.g., ./program <repeating-argument>...:

    {
      "repeating_argument": ["value1", "value2", "value3"]
    }
    

    Examples:

    1. For a usage pattern ./program <file>:

      ./program document.txt
      

      Results in:

      {
        "file": "document.txt"
      }
      

      Note: Uppercase arguments are converted to lowercase in the resulting JSON.

      For usage pattern ./program FILE:

      ./program document.txt
      

      Results in:

      {
        "file": "document.txt"
      }
      
    2. For a usage pattern ./program <file>...:

      ./program file1.txt file2.txt file3.txt
      

      Results in:

      {
        "file": ["file1.txt", "file2.txt", "file3.txt"]
      }
      
    3. For a usage pattern ./program (<source> <dest>)...:

      ./program file1.txt dir1 file2.txt dir2
      

      Results in:

      {
        "source": ["file1.txt", "file2.txt"],
        "dest": ["dir1", "dir2"]
      }
      
    4. For a usage pattern ./program [--verbose] <command>:

      ./program --verbose start
      

      Results in:

      {
        "options": {
          "verbose": true
        },
        "command": "start"
      }
      

    Accessing parsed values in rash scripts

    Within your rash script, you can access these values using standard variable access syntax:

    #!/usr/bin/env rash
    
    # Usage: ./script.rh <name> [--count=<n>]
    #
    # Options:
    #   --count=<n>  Number of iterations [default: 1]
    
    - name: Print a greeting
      shell:
        cmd: echo "Hello, {{name}}! ({{options.count}} times)"
    

    When invoked with ./script.rh World --count=3, it would print: Hello, World! (3 times)