-
Star
(291)
You must be signed in to star a gist -
Fork
(38)
You must be signed in to fork a gist
-
-
Save kovetskiy/a4bb510595b3a6b17bfd1bd9ac8bb4a5 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
### | |
### my-script — does one thing well | |
### | |
### Usage: | |
### my-script <input> <output> | |
### | |
### Options: | |
### <input> Input file to read. | |
### <output> Output file to write. Use '-' for stdout. | |
### -h Show this message. | |
help() { | |
sed -rn 's/^### ?//;T;p' "$0" | |
} | |
if [[ $# == 0 ]] || [[ "$1" == "-h" ]]; then | |
help | |
exit 1 | |
fi | |
echo Hello World |
Awesome idea, thanks very much!
Very cool.
That's a good idea. Awesome!
Glad someone proved this is a good strategy to write helper message, I also did it in my commonly-used script:
https://gist.github.com/typebrook/b0d2e7e67aa50298fdf8111ae7466b56#file-gist
what I did is simply print the comment at the top(except the first line to # --
):
sed -Ene "/^#/ !q; 1,/^# --/ d; s/^# //p
This doesn't actually work cross-platform, the
-r
option does not exist on macOS. You can do the same withawk
though, just use:
-E
works on BSD sed, so you can make it portable with sed -Ene 's/^### ?//;T;p' "$0"
both on mac(BSD sed) or Linux(GNU sed).
666
Why even use the extended version?
sed -n 's/^###//p'
achieves the same. Just keep the leading ###
format to the help only.
sed -n '/^###/ s///p'
this one's faster but a tiny bit more verbose.
and sed '/^###/!d'
if you don't mind hashes. Or grep "^###"
My version, that doesn't require multiple #
(but allows more than one if you want it for stylistic reasons):
#!/bin/bash
# Usage:
# test_usage.sh ...
print_usage_and_exit() {
# The sed script below:
# - Deletes the first line (shebang).
# - Quits on the first line that doesn't start with #.
# - Removes the '#+ ?' prefix from the string.
sed -En '1d; /^[^#]/ q; s/^#+ ?//p;' < "$0" >&2
exit 1
}
Complete awk version:
I personally use macros to add help messages to my zsh functions. It's as easy as: