i didnt care about how i wrote my bash scripts, coz i know theyd ultimately be used just by myself. but for the past few day, i’ve been working on this project, mk-blog which uses some bash scripts, there are chances that others might look at them. besides in work they’re asking me maintain a server. so why not learn the standards. but i couldn’t find anything good online (i’m gonna blame my search engine lol). so…
i’d appreciate redirections to (official or community) bash coding standards
ShellCheck is a static analysis tool for bash/sh scripts - try it on your scripts. The README also shows some examples of what (not) to do.
The link to your project gives me a 404 btw, is it a private repository?
I love ShellCheck! It’s one of the biggest FOSS projects written in Haskell.
Thanks. I checked it out. It’d be cool if they have LSP setup.
And thanks for informing about the link, I made a typo :]
But it is written in haskell, unpractical language
Well Why do I love trolling this much…
There is no single Bash standard to follow, only a few guidelines. One way you can check for some basic errors and formatting would be using an editor with support for Bash (in best case with a builtin LSP). At the end, you have to find your style and coding standards or adapt what others do if you want work with them or edit their files.
- Otherwise there is a well known tool for checking Bash files: https://www.shellcheck.net/ You can use it online and as a downloaded program on your local machine. After using shellcheck for a bit I got used to some of its conventions and recommendations, such as always wrapping variables like in
${variable}
and some other things. - Google has a coding style guide, but not everyone likes it: https://google.github.io/styleguide/shellguide.html
- Related is the Bash Reference Manual from GNU: https://www.gnu.org/software/bash/manual/bash.html Off course this is not a guide on how to style or program, but it helps in understanding how GNU does things.
BTW the mk-blog link is 404 for me.
deleted by creator
Thanks.
I assume you opened the link. Did you read that projnct intro by any chance? Im struggling to name the project. Some suggestion can help.
Yeah I came across that google’s guide, but I skipped it when I found out its from google. And thanks for informing about the link, I made a typo
- Otherwise there is a well known tool for checking Bash files: https://www.shellcheck.net/ You can use it online and as a downloaded program on your local machine. After using shellcheck for a bit I got used to some of its conventions and recommendations, such as always wrapping variables like in
Don’t know about everyone else, but here are some of mine:
- Stick to posix compliance shell code, wherever possible
- Please wrap your variables with { }. Just please.
- Global variables being exported in all caps
- Local variables in lower case
- $() instead of ` `
- Comment anything complicated, comment what section, comment usage
- Include usage output if options are not recognized
- Use case instead of if / elif, where possible
- 80 characters or less per line, where possible
- HERE docs in designated section, marked by comment blocks
- Comment your functions immediately above it’s definition
- Add comment “#End of function Xyz” at line immediately below a function, with replacing Xyz with name of that function
- 2 space indentation
- Multi-line strings: First line open with quote and first line of string, followed by a backslash , subsequent lines properly indented and backslashed. Last line, properly indented and close quoted.
- Break up multiple piping of commands with |\ and a new line where it makes sense to look nice, assisting readability
- Echo what the script is doing once in a while if the user will be waiting for a while
- Please don’t do shar archives, or byte located binary extractions, make a script and a separate tarball - Helps a ton if we have to change it, like say… swapping out a bundled java runtime built for x86_64 with one for aarch64
- If the script will run for a very long time, check for tmux or screen and also the TMOUT variable… Give a warning to the user their connection might time out before the script is done if they don’t unset TMOUT, and try using tmux or screen to allow the script to continue in the background, even if you do get disconnected
- Make use of logger
- I try to organize a script this way: 1. Shebang, 2. Initial variable definitions, 3. Functions, 4. runtime execution code, which might be best outside of a function, and calling functions. 5. Clean-up (remove pid and lock files, tmp files, etc etc.)
This guy scripts
Only thing to disagree here is 80 char limit, would go for 120 personally.
Also, IMHO, pipes should be at the beginning of the next line, not at the end of the previous one.
Makes cleaner commits and nicer diffs.
A post to save ❤️
Repos are archived by the maintainer, but I find these really helpful resources:
https://github.com/dylanaraps/pure-bash-bible https://github.com/dylanaraps/pure-sh-bible
Thanks
Choose whatever fits you
And stick to it! Also make sure other participants also adhere to that. Optionally configure a linter for doing that.
https://github.com/bash-lsp/bash-language-server
- pretty much all editors support LSP these days
Yeah, I have bash ls installed, but it wont teach me coding standards right
If your bash script gets longer than 200 lines (including argument handling), use Python. I have to support bash APPLICATIONS at work and it’s a fucking nightmare to maintain.
I’ve used shfmt in the past: https://github.com/patrickvane/shfmt