2

is there any possibility to add "help" to written by you bash script in Linux (Debian)? I mean specifically, by using command yourscript --help or yourscript -h

1
  • in some high level programming languages, some packages will come with a help formatter so that a help can be generated with the definitions of the options. sadly, not quite capable for bash only. Commented Mar 26, 2015 at 20:15

3 Answers 3

2

It doesn't have to be harder than this.

case $1 in
 -[h?] | --help)
    cat <<-____HALP
        Usage: ${0##*/} [ --help ]
        Outputs a friendly help message if you can figure out how.
____HALP
        exit 0;;
esac

If you use getopts for option processing, use that to identify the option; but the action is going to look more or less similar (and IMNSHO getopts doesn't really offer anything over a simple while ... shift loop).

Sign up to request clarification or add additional context in comments.

Comments

1

getopt

#!/bin/bash

args=$(getopt -n "$(basename "$0")" -o h --longoptions help -- "$@") || exit 1
eval set -- "$args"

while :; do
    case $1 in
        -h|--help) echo offer help here ; exit ;;
        --) shift; break ;;
        *) echo "error: $1"; exit 1;;
    esac
done

echo "hello world, $*"

Comments

0

There are many ways to do this. Over time I have come to prefer separate usage and help functions. The help is provided in response to a request for either --help or -h and it provides extended help/option information in a heredoc format. The usage function is provided in response to an invalid input. It is short and provides a quick reminder of what the script needs. Both functions take a string as the first argument that allows you to pass an error message to be displayed along with the help or usage. Both also allow you to pass an exit code as the second argument.

The following is an example I pulled from an existing script. You can ignore the contents, but it was left by way of example:

function help {
  local ecode=${2:-0}

  [[ -n $1 ]] && printf "\n $1\n" >&2

cat >&2 << helpMessage

  Usage: ${0##*/} <ofile> <file.c> [ <cflags> ... --log [ \$(<./bldflags)]]

    ${0##*/} calls 'gcc -Wall -o <ofile> <file.c> <cflags> <\$(<./bldflags)>'
    If the file './bldflags' exists in the present directory, its contents are
    read into the script as additional flags to pass to gcc. It is intended to
    provide a simple way of specifying additional libraries common to the source
    files to be built. (e.g. -lssl -lcrypto).

    If the -log option is given, then the compile string and compiler ouput are
    written to a long file in ./log/<ofile>_gcc.log

  Options:

    -h  |  --help  program help (this file)
    -l  |  --log   write compile string and compiler ouput to ./log/<ofile>_gcc.log

helpMessage

  exit $ecode
}

function usage {
  local ecode=${2:-0}

  [[ -n $1 ]] && printf "\n $1\n" >&2

  printf "\n  Usage: %s <ofile> <file.c> [ <cflags> ... --log [ \$(<./bldflags)]]\n\n" "${0##*/}"

  exit $ecode
}

I generally test for help when looking at all arguments, e.g.:

## test for help and log flags and parse remaining args as cflags
for i in $*; do
    test "$i" == "-h" || test "$i" == "--help" && help
    ...
done

Usage is provided in response to an invalid input, e.g.:

[ -f "$1" ] || usage "error: first argument is not a file." 1

They come in handy and I've preferred this approach to getopts.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.