When I first started programming, I was convinced that half my programs had uncovered bugs in the compiler.
They never were. "Oh. 'Missing semicolon on line 71' goes away if I put a semicolon in."
Because compilers are more mature than my code, the probability is higher that bugs are mine.
When a shell script I wrote last week failed, I began carving it down to see what I'd done wrong. This is usually fast and easy--chop pieces out of the script until you can get a very simplified statement that doesn't do what I thought it should do, then go back to read the man page to see why.
Here's the simplified test case I ended up with:
set -x # this is requiredPS4='$(true)$ ' # must be a command in the prompt, but any command will dofalse || A=3 # first expression must fail, second must be a variable assignmentecho $? # Should be 0, but isn't. Odd.
Much to my surprise, it's bug in bash, both versions 3 and 4.
Obscure? Sure. You have to have a lot of special things going on, and the symptom is a bad exit code. I reported it and used a workaround (if .. fi instead of the shortcut logical or).
Always remember: every program has bugs. They're only almost always yours.