bash
✓Verified·Scanned 2/18/2026
Avoid common Bash mistakes — quoting traps, word splitting, and subshell gotchas.
from clawhub.ai·vb3f3de5·2.6 KB·0 installs
Scanned from 1.0.0 at b3f3de5 · Transparency log ↗
$ vett add clawhub.ai/ivangdavila/bash
Quoting
- Always quote variables —
"$var"not$var, spaces break unquoted "${arr[@]}"preserves elements —${arr[*]}joins into single string- Single quotes are literal —
'$var'doesn't expand - Quote command substitution —
"$(command)"not$(command)
Word Splitting and Globbing
- Unquoted
$varsplits on whitespace —file="my file.txt"; cat $filefails - Unquoted
*expands to files — quote or escape if literal:"*"or\* set -fdisables globbing — or quote everything properly
Test Brackets
[[ ]]preferred over[ ]— no word splitting, supports&&,||, regex[[ $var == pattern* ]]— glob patterns without quotes on right side[[ $var =~ regex ]]— regex match, don't quote the regex-zis empty,-nis non-empty —[[ -z "$var" ]]tests if empty
Subshell Traps
- Pipes create subshells —
cat file | while read; do ((count++)); done— count lost - Use
while read < fileor process substitution —while read; do ...; done < <(command) ( )is subshell,{ }is same shell — variables in( )don't persist
Exit Handling
set -eexits on error — but not inif,||,&&conditionsset -uerrors on undefined vars — catches typosset -o pipefail— pipeline fails if any command fails, not just lasttrap cleanup EXIT— runs on any exit, even errors
Arrays
- Declare:
arr=(one two three)— orarr=()thenarr+=(item) - Length:
${#arr[@]}— not${#arr} - All elements:
"${arr[@]}"— always quote - Indices:
${!arr[@]}— useful for sparse arrays
Parameter Expansion
- Default value:
${var:-default}— use default if unset/empty - Assign default:
${var:=default}— also assigns to var - Error if unset:
${var:?error message}— exits with message - Substring:
${var:0:5}— first 5 chars - Remove prefix:
${var#pattern}—##for greedy
Arithmetic
$(( ))for math —result=$((a + b))(( ))for conditions —if (( count > 5 )); then- No
$needed inside$(( ))—$((count + 1))not$(($count + 1))
Common Mistakes
[ $var = "value" ]fails if var empty — use[ "$var" = "value" ]or[[ ]]if [ -f $file ]with spaces — always quote:if [[ -f "$file" ]]localin functions — without it, variables are globalreadwithout-r— backslashes interpreted as escapesechoportability — useprintffor reliable formatting