Skip to content
Back to skills

Write Reliable Bash Scripts

ASecurity

Write reliable Bash scripts with proper quoting, error handling, and parameter expansion.

  • 19 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 19, 2026
ai-agentsgoshellbashtesting

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 19, 2026

npx -y skills add rondoflow/rondoflow --skill write-reliable-bash-scripts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Write Reliable Bash Scripts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Write Reliable Bash Scripts
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/rondoflow-write-reliable-bash-scripts/badge)](https://www.skillsdirectory.com/skills/rondoflow-write-reliable-bash-scripts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: write-reliable-bash-scripts
description: "Write reliable Bash scripts with proper quoting, error handling, and parameter expansion."
category: "Content & Writing"
author: community
version: "1.0.2"
icon: pencil
---

## Quick Reference

| Topic | File |
|-------|------|
| Arrays and loops | `arrays.md` |
| Parameter expansion | `expansion.md` |
| Error handling patterns | `errors.md` |
| Testing and conditionals | `testing.md` |

## Quoting Traps

- 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 `$var` splits on whitespace—`file="my file.txt"; cat $file` fails
- Unquoted `*` expands to files—quote or escape if literal: `"*"` or `\*`
- `set -f` disables 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
- `-z` is empty, `-n` is non-empty—`[[ -z "$var" ]]` tests if empty

## Subshell Traps

- Pipes create subshells—`cat file | while read; do ((count++)); done`—count lost
- Use `while read < file` or process substitution—`while read; do ...; done < <(command)`
- `( )` is subshell, `{ }` is same shell—variables in `( )` don't persist

## Exit Handling

- `set -e` exits on error—but not in `if`, `||`, `&&` conditions
- `set -u` errors on undefined vars—catches typos
- `set -o pipefail`—pipeline fails if any command fails, not just last
- `trap cleanup EXIT`—runs on any exit, even errors

## Arrays

- Declare: `arr=(one two three)`—or `arr=()` then `arr+=(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" ]]`
- `local` in functions—without it, variables are global
- `read` without `-r`—backslashes interpreted as escapes
- `echo` portability—use `printf` for reliable formatting

Files in this skill

  • SKILL.md2.8 KB
  • manifest.json312 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…