Download

arg

A command line argument parser

  • CLI
Code 77 linesC 48Makefile 29
NameModifiedLinesSize
LICENSE 20 lines9% of this folder's lines 1.1 KiB15% of this folder's bytes
Makefile 35 lines17% of this folder's lines 763 B11% of this folder's bytes
README.md 40 lines19% of this folder's lines 1.6 KiB23% of this folder's bytes
arg.1 66 lines31% of this folder's lines 1.9 KiB27% of this folder's bytes
arg.c 50 lines24% of this folder's lines 1.6 KiB24% of this folder's bytes

README.md

arg - A simple command line argument parser

This is a simple tool with a simple job: figure out the value of a single command line argument. Tools like getopt and getopts are unnecessarily complex and difficult to use, while also not supporting common use cases well. Parsing an argument in a shell script shouldn't require a tutorial or dozen lines of shell code!

To quote the getopt manpage:

Each shellscript has to carry complex code to parse arguments halfway correcty (like the example presented here). A better getopt-like tool would move much of the complexity into the tool and keep the client shell scripts simpler.

Usage

Simply run: arg <flag> <extra args...>. <flag> can be anything, like -f, -flag, --flag, or flag. If the flag occurs among the rest of the command line arguments, arg will print the flag's value (if any) and exit successfully, otherwise, it will fail (exit status 1). In a shell script, this would look like:

#!/bin/sh
dir=`arg --dir "$@" || arg -d "$@" || echo "$HOME/Downloads"`
if ! server=`arg --server "$@" || arg -s "$@"`; then
    echo "No server provided :(" && exit 1
fi
if arg --verbose "$@" || arg -v "$@"; then
    echo "Downloading to $dir"
fi
curl "$server/file.zip" > "$dir/file.zip"

The flag's value may be of the form <flag>=<value> or <flag> <value>. Single-letter flags will also match when grouped with other single letter flags, but will not have a value (e.g. arg -b -abc foo will succeed without printing anything).

When using arg in a shell script, it is best to use quotes around $@, as in arg --foo "$@", so arguments with spaces will be forwarded correctly.