| name | shell-scripting |
| description | Shell scripting best practices for cross-platform CLI tools |
Shell Scripting Standards
When to Use
- Writing new shell scripts
- Refactoring existing scripts
- Adding new functions
Script Structure
1. File Header
#!/bin/bash
set -e
2. Constants (UPPER_CASE)
VERSION="1.2.0"
CONFIG_DIR="$HOME/.claude"
DEFAULT_SOUND="Glass"
3. Functions (snake_case)
function_name() {
local name="$1"
local value="${2:-default}"
}
4. Main Logic
main() {
validate_args "$@"
do_work
cleanup
}
main "$@"
Best Practices
Variable Handling
echo "$message"
path="$HOME/.config"
echo $message
path=$HOME/.config
Conditionals
if [[ -n "$var" ]]; then
echo "not empty"
fi
if [ -n "$var" ]; then
echo "not empty"
fi
Command Existence Check
if command -v terminal-notifier &> /dev/null; then
terminal-notifier -message "Hello"
fi
if which terminal-notifier; then
terminal-notifier -message "Hello"
fi
Error Handling
if ! some_command; then
echo "Error: command failed" >&2
exit 1
fi
cleanup() {
rm -f "$temp_file"
}
trap cleanup EXIT
Local Variables in Functions
my_function() {
local input="$1"
local result
result=$(process "$input")
echo "$result"
}
my_function() {
input="$1"
result=$(process "$input")
echo "$result"
}
Common Patterns
OS Detection
detect_os() {
case "$(uname -s)" in
Darwin*) echo "macos" ;;
Linux*) echo "linux" ;;
CYGWIN*|MINGW*|MSYS*) echo "windows" ;;
*) echo "unknown" ;;
esac
}
Safe File Operations
mkdir -p "$dir"
if [[ -f "$config_file" ]]; then
config=$(cat "$config_file")
fi
echo "$content" > "$file.tmp" && mv "$file.tmp" "$file"
JSON Handling (without jq)
if grep -q '"enabled":\s*true' "$file"; then
echo "enabled"
fi
if command -v jq &> /dev/null; then
value=$(jq -r '.key' "$file")
fi
Testing
Test Function Output
test_detect_os() {
result=$(detect_os)
if [[ "$result" != "macos" ]] && [[ "$result" != "linux" ]]; then
echo "FAIL: unexpected OS: $result"
return 1
fi
echo "PASS"
}
Test Exit Codes
test_error_handling() {
if invalid_command 2>/dev/null; then
echo "FAIL: should have failed"
return 1
fi
echo "PASS"
}
Success Metrics
- shellcheck passes with no warnings
- All functions use local variables
- All variables are quoted
- Commands existence checked before use
- Error handling for all failure points