# Argc [![CI](https://github.com/sigoden/argc/actions/workflows/ci.yaml/badge.svg)](https://github.com/sigoden/argc/actions/workflows/ci.yaml) [![Crates](https://img.shields.io/crates/v/argc.svg)](https://crates.io/crates/argc) Argc is a powerful Bash framework that simplifies building full-featured CLIs. It lets you define your CLI through comments, focusing on your core logic without dealing with argument parsing, usage text, error messages, and other boilerplate code. ![demo](https://user-images.githubusercontent.com/4012553/228990851-fee5649f-aa24-4297-a924-0d392e0a7400.gif) ## Features - **Effortless Argument Parsing:** - Handles flags, options, positional arguments, and subcommands. - Validates user input for robust error handling. - Generates information-rich usage text. - Maps arguments to corresponding variables. - **Standalone Bash Script Creation:** - Build a bash script that incorporates all functionalities without depending on Argc itself. - **Cross-shell Autocompletion:** - Generate autocompletion scripts for various shells (bash, zsh, fish, powershell, etc.). - **Man Page Generation:** - Automatically create comprehensive man page documentation for your script. - **Environment Variable Integration:** - Define, validate, and bind environment variables to options and positional arguments. - **Task Automation:** - An Bash-based command runner that automates tasks via Argcfile.sh. - **Cross-Platform Compatibility:** - Seamlessly run your Argc-based scripts on macOS, Linux, Windows, and BSD systems. ## Install ### Package Managers - **Rust Developers:** `cargo install argc` - **Homebrew/Linuxbrew Users:** `brew install argc` - **Pacman Users**: `yay -S argc` #### Pre-built Binaries Alternatively, download pre-built binaries for macOS, Linux, and Windows from [GitHub Releases](https://github.com/sigoden/argc/releases), extract it, and add the `argc` binary to your `$PATH`. You can use the following command on Linux, MacOS, or Windows to download the latest release. ``` curl -fsSL https://raw.githubusercontent.com/sigoden/argc/main/install.sh | sh -s -- --to /usr/local/bin ``` ### GitHub Actions [install-binary](https://github.com/sigoden/install-binary) can be used to install argc in a GitHub Actions workflow. ```yaml - uses: sigoden/install-binary@v1 with: repo: sigoden/argc ``` ## Get Started Building a command-line program using Argc is a breeze. Just follow these two steps: **1. Design Your CLI Interface:** Describe options, flags, positional parameters, and subcommands using comment tags (explained later). **2. Activate Argument Handling:** Add this line to your script: `eval "$(argc --argc-eval "$0" "$@")"`. This integrates Argc's parsing magic into your program. Let's illustrate with an example: ```sh # @flag -F --foo Flag param # @option --bar Option param # @option --baz* Option param (multi-occurs) # @arg val* Positional param eval "$(argc --argc-eval "$0" "$@")" echo foo: $argc_foo echo bar: $argc_bar echo baz: ${argc_baz[@]} echo val: ${argc_val[@]} ``` Run the script with some sample arguments: ```sh ./example.sh -F --bar=xyz --baz a --baz b v1 v2 ``` Argc parses these arguments and creates variables prefixed with `argc_`: ``` foo: 1 bar: xyz baz: a b val: v1 v2 ``` Just run `./example.sh --help` to see the automatically generated help information for your CLI: ``` USAGE: example [OPTIONS] [VAL]... ARGS: [VAL]... Positional param OPTIONS: -F, --foo Flag param --bar Option param --baz [BAZ]... Option param (multi-occurs) -h, --help Print help -V, --version Print version ``` With these simple steps, you're ready to leverage Argc and create robust command-line programs! ## Comment Tags Comment tags are standard Bash comments prefixed with `@` and a specific tag. They provide instructions to Argc for configuring your script's functionalities. | Tag | Description | | :---------------------------------------------- | ------------------------------------- | | [`@describe`](./docs/specification.md#describe) | Sets the description for the command. | | [`@cmd`](./docs/specification.md#cmd) | Defines a subcommand. | | [`@alias`](./docs/specification.md#alias) | Sets aliases for the subcommand. | | [`@arg`](./docs/specification.md#arg) | Defines a positional argument. | | [`@option`](./docs/specification.md#option) | Defines an option argument. | | [`@flag`](./docs/specification.md#flag) | Defines a flag argument. | | [`@env`](./docs/specification.md#env) | Defines an environment variable. | | [`@meta`](./docs/specification.md#meta) | Adds metadata. | See [specification](https://github.com/sigoden/argc/blob/main/docs/specification.md) for the grammar and usage of all the comment tags. ## Argc-build Generate an independent bash script that incorporates all functionalities typically available when the `argc` command is present. The generated script removes the `argc` dependency, enhances compatibility, and enables deployment in a wider range of environments. ``` argc --argc-build