| name | bash-dev |
| description | Bash scripting development standards, error handling, and best practices. Activated when working with .sh files or Bash scripts. |
| allowed-tools | ["Read","Grep","Bash"] |
Bash Development Expert
This skill supports Bash script development with best practices and safety standards.
🎯 Core Rules
Shebang and Safety
- Shebang: Always use
#!/usr/bin/env bash
- Set Options: Always use
set -euo pipefail
-e: Exit on error
-u: Exit on undefined variable
-o pipefail: Fail pipeline if any command fails
Variable Handling
- Quoting: Always quote variables
"${var}"
- Constants: Use UPPERCASE for global/environment variables
- Local Variables: Use lowercase for function-local variables
- Readonly: Use
readonly for constants
Function Best Practices
- Local Variables: Always use
local keyword
- Parameter Validation: Validate required parameters
- Return Codes: 0 for success, non-zero for errors
- Documentation: Document usage, description, and return codes
📚 Script Template
Standard Script Structure
#!/usr/bin/env bash
set -euo pipefail
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
readonly VERSION="1.0.0"
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m'
usage() {
cat <<EOF
Usage: ${SCRIPT_NAME} <arg1> [arg2]
Description:
What this script does in detail
Arguments:
arg1 Required argument description
arg2 Optional argument description (default: value)
Options:
-h, --help Show this help message
-v, --version Show version information
Examples:
${SCRIPT_NAME} value1
${SCRIPT_NAME} value1 value2
EOF
}
() {
-e >&2
1
}
() {
-e
}
() {
-e
}
() {
arg1=
arg2=
info
info
0
}
ERR
-h|--)
usage
0
;;
-v|--version)
0
;;
main
🛠️ Common Patterns
Error Handling
if ! command -v git &> /dev/null; then
error "git is not installed"
fi
if [[ ! -f "${config_file}" ]]; then
error "Config file not found: ${config_file}"
fi
if [[ ! -d "${target_dir}" ]]; then
mkdir -p "${target_dir}" || error "Failed to create directory"
fi
Input Validation
validate_arg() {
local arg="${1:?Error: argument required}"
if [[ -z "${arg}" ]]; then
error "Argument cannot be empty"
fi
}
validate_number() {
local num="$1"
if ! [[ "${num}" =~ ^[0-9]+$ ]]; then
error "Invalid number: ${num}"
fi
}
File Operations
read_file() {
local file="$1"
if [[ ! -r "${file}" ]]; then
error "Cannot read file: ${file}"
fi
cat "${file}"
}
write_file() {
local file="$1"
local content="$2"
echo "${content}" > "${file}" || error "Failed to write file"
}
Array Handling
declare -a items=("item1" "item2" "item3")
for item in "${items[@]}"; do
echo "Processing: ${item}"
done
echo "Total items: ${#items[@]}"
🎯 Quality Checklist
Check these before committing:
🔍 Common Anti-patterns to Avoid
❌ Don't:
cd $HOME/dir
mkdir /some/dir
echo $UNDEFINED_VAR
✅ Do:
cd "${HOME}/dir" || error "Failed to change directory"
mkdir -p "${target_dir}" || error "Failed to create directory"
if [[ -n "${VAR:-}" ]]; then
echo "${VAR}"
fi
set -euo pipefail
💡 Testing
Using ShellCheck
brew install shellcheck
shellcheck script.sh
command ${unquoted}
Testing Functions
test_function() {
local expected="expected_value"
local actual
actual="$(your_function)"
if [[ "${actual}" != "${expected}" ]]; then
error "Test failed: expected '${expected}', got '${actual}'"
fi
info "Test passed"
}