
Shell Scripting Fundamentals
- 52 installs
- 186 repo stars
- Updated July 19, 2026
- thebushidocollective/han
Helps with ai & agent building tasks during AI-assisted development.
About
shell-scripting-fundamentals is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- shell-scripting-fundamentals
- AI & Agent Building
- AI-coding skill
Shell Scripting Fundamentals by the numbers
- 52 all-time installs (skills.sh)
- +3 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #7,142 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/thebushidocollective/han --skill shell-scripting-fundamentalsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 52 |
|---|---|
| repo stars | ★ 186 |
| Last updated | July 19, 2026 |
| Repository | thebushidocollective/han ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Shell Scripting Fundamentals
Core patterns and best practices for writing robust, maintainable shell scripts.
Script Structure
Always start scripts with a proper shebang and safety options:
#!/usr/bin/env bash
set -euo pipefail
# Script description hereSafety Options Explained
set -e: Exit on any command failureset -u: Error on undefined variablesset -o pipefail: Pipeline fails if any command fails
Variables
Declaration and Assignment
# No spaces around =
name="value"
# readonly for constants
readonly CONFIG_DIR="/etc/myapp"
# local in functions
my_function() {
local result="computed"
echo "$result"
}Always Quote Variables
# Good - prevents word splitting and glob expansion
echo "$variable"
cp "$source" "$destination"
# Bad - can break on spaces or special characters
echo $variable
cp $source $destinationDefault Values
# Use default if unset
name="${NAME:-default}"
# Use default if unset or empty
name="${NAME:-}"
# Assign default if unset
: "${NAME:=default}"
# Error if unset
: "${REQUIRED_VAR:?Error: REQUIRED_VAR must be set}"Conditionals
Test Syntax
# Modern syntax - preferred
if [[ -f "$file" ]]; then
echo "File exists"
fi
# String comparison
if [[ "$string" == "value" ]]; then
echo "Match"
fi
# Numeric comparison
if (( count > 10 )); then
echo "Greater than 10"
fi
# Regex matching
if [[ "$input" =~ ^[0-9]+$ ]]; then
echo "Numeric input"
fiCommon Test Operators
| Operator | Description |
|---|---|
-f | File exists and is regular file |
-d | Directory exists |
-e | Path exists |
-r | Readable |
-w | Writable |
-x | Executable |
-z | String is empty |
-n | String is not empty |
Loops
For Loops
# Iterate over list
for item in one two three; do
echo "$item"
done
# Iterate over files (use glob, not ls)
for file in *.txt; do
[[ -e "$file" ]] || continue # Handle no matches
process "$file"
done
# C-style for loop
for (( i = 0; i < 10; i++ )); do
echo "$i"
doneWhile Loops
# Read lines from file
while IFS= read -r line; do
echo "$line"
done < "$filename"
# Read with process substitution
while IFS= read -r line; do
echo "$line"
done < <(some_command)Arrays
# Declare array
declare -a files=()
# Add elements
files+=("file1.txt")
files+=("file2.txt")
# Iterate all elements
for file in "${files[@]}"; do
echo "$file"
done
# Get array length
echo "${#files[@]}"
# Access by index
echo "${files[0]}"Command Substitution
# Modern syntax - preferred
result=$(command)
# Nested substitution
result=$(echo $(date))
# Avoid legacy backticks
result=`command` # Don't use thisFunctions
# Function definition
process_file() {
local file="$1"
local output_dir="${2:-./output}"
if [[ ! -f "$file" ]]; then
echo "Error: File not found: $file" >&2
return 1
fi
# Process the file
cp "$file" "$output_dir/"
}
# Call with arguments
process_file "input.txt" "/tmp/output"Best Practices Summary
1. Always use #!/usr/bin/env bash for portability 2. Enable strict mode: set -euo pipefail 3. Quote all variable expansions 4. Use [[ ]] instead of [ ] for tests 5. Use $(command) instead of backticks 6. Declare local variables in functions 7. Use arrays for lists of items 8. Check command existence before use: command -v cmd >/dev/null