Agent skill
shell-scripting
Shell scripting best practices for cross-platform CLI tools
Install this agent skill to your Project
npx add-skill https://github.com/mylee04/code-notify/tree/main/.claude/skills/shell-scripting
SKILL.md
Shell Scripting Standards
When to Use
- Writing new shell scripts
- Refactoring existing scripts
- Adding new functions
Script Structure
1. File Header
#!/bin/bash
# Script description
# https://github.com/mylee04/code-notify
set -e # Exit on error
2. Constants (UPPER_CASE)
VERSION="1.2.0"
CONFIG_DIR="$HOME/.claude"
DEFAULT_SOUND="Glass"
3. Functions (snake_case)
# Description of function
# Arguments: $1 = name, $2 = optional value
function_name() {
local name="$1"
local value="${2:-default}"
# Function body
}
4. Main Logic
# Main execution
main() {
validate_args "$@"
do_work
cleanup
}
main "$@"
Best Practices
Variable Handling
# Good - quoted variables
echo "$message"
path="$HOME/.config"
# Bad - unquoted
echo $message
path=$HOME/.config
Conditionals
# Good - double brackets
if [[ -n "$var" ]]; then
echo "not empty"
fi
# Bad - single brackets
if [ -n "$var" ]; then
echo "not empty"
fi
Command Existence Check
# Good
if command -v terminal-notifier &> /dev/null; then
terminal-notifier -message "Hello"
fi
# Bad
if which terminal-notifier; then
terminal-notifier -message "Hello"
fi
Error Handling
# Good - explicit error handling
if ! some_command; then
echo "Error: command failed" >&2
exit 1
fi
# Good - trap for cleanup
cleanup() {
rm -f "$temp_file"
}
trap cleanup EXIT
Local Variables in Functions
# Good
my_function() {
local input="$1"
local result
result=$(process "$input")
echo "$result"
}
# Bad - pollutes global scope
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
# Create directory if not exists
mkdir -p "$dir"
# Safe file reading
if [[ -f "$config_file" ]]; then
config=$(cat "$config_file")
fi
# Atomic write
echo "$content" > "$file.tmp" && mv "$file.tmp" "$file"
JSON Handling (without jq)
# Simple grep-based check
if grep -q '"enabled":\s*true' "$file"; then
echo "enabled"
fi
# With jq (if available)
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
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
cross-platform
Cross-platform development patterns for macOS, Windows, and Linux
verl-rl-training
Provides guidance for training LLMs with reinforcement learning using verl (Volcano Engine RL). Use when implementing RLHF, GRPO, PPO, or other RL algorithms for LLM post-training at scale with flexible infrastructure backends.
openrlhf-training
High-performance RLHF framework with Ray+vLLM acceleration. Use for PPO, GRPO, RLOO, DPO training of large models (7B-70B+). Built on Ray, vLLM, ZeRO-3. 2× faster than DeepSpeedChat with distributed architecture and GPU resource sharing.
gguf-quantization
GGUF format and llama.cpp quantization for efficient CPU/GPU inference. Use when deploying models on consumer hardware, Apple Silicon, or when needing flexible quantization from 2-8 bit without GPU requirements.
Claude Code Guide
Master guide for using Claude Code effectively. Includes configuration templates, prompting strategies "Thinking" keywords, debugging techniques, and best practices for interacting with the agent.
qdrant-vector-search
High-performance vector similarity search engine for RAG and semantic search. Use when building production RAG systems requiring fast nearest neighbor search, hybrid search with filtering, or scalable vector storage with Rust-powered performance.
Didn't find tool you were looking for?