Bash/Shell Scripting Beispiele

Wesentliche Bash-Scripting-Beispiele für Systemverwaltung und Automatisierung

💻 Bash Hello World bash

🟢 simple

Grundlegendes Hello World-Script in Bash und fundamentale Shell-Programmierkonzepte

⏱️ 15 min 🏷️ bash, shell, scripting, linux, automation
Prerequisites: Basic command line knowledge, Understanding of shell concepts
#!/bin/bash

# Bash Hello World Examples

# 1. Basic Hello World
echo "Hello, World!"

# 2. Hello World with variable
message="Hello, World!"
echo $message

# 3. Hello World with function
say_hello() {
    echo "Hello, World!"
}

say_hello

# 4. Hello World with function parameters
greet() {
    echo "Hello, $1!"
}

greet "World"
greet "Bash"

# 5. Hello World with read input
echo "Enter your name:"
read name
echo "Hello, $name!"

# 6. Hello World multiple times
for i in {1..5}
do
    echo "Hello, World! $i"
done

# 7. Hello World with array
greetings=("Hello" "Bonjour" "Hola" "Ciao" "こんにちは")

for greeting in "${greetings[@]}"
do
    echo "$greeting, World!"
done

# 8. Hello World with condition
current_hour=$(date +%H)

if [ $current_hour -lt 12 ]; then
    echo "Good morning, World!"
elif [ $current_hour -lt 18 ]; then
    echo "Good afternoon, World!"
else
    echo "Good evening, World!"
fi

# 9. Hello World with colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${RED}Red${NC} Hello, ${GREEN}Green${NC} World!"
echo -e "${YELLOW}Yellow${NC} Bash Scripting!"

# 10. Hello World with logging
LOG_FILE="hello_world.log"

echo "Hello, World!" | tee -a "$LOG_FILE"
echo "Script executed at: $(date)" >> "$LOG_FILE"

echo "Log file created: $LOG_FILE"

# Basic data types and operations

# Strings
name="Bash Scripting"
echo "String variable: $name"
echo "String length: ${#name}"

# Numbers
num1=10
num2=5
echo "Numbers: $num1 and $num2"
echo "Sum: $((num1 + num2))"
echo "Difference: $((num1 - num2))"
echo "Product: $((num1 * num2))"
echo "Division: $((num1 / num2))"
echo "Modulus: $((num1 % num2))"

# Using expr for floating point (requires bc)
echo "Using bc for floating point:"
echo "10 / 3" | bc
echo "scale=2; 10 / 3" | bc

# Arrays
fruits=("apple" "banana" "cherry" "date")
echo "Fruits array: ${fruits[@]}"
echo "Number of fruits: ${#fruits[@]}"
echo "First fruit: ${fruits[0]}"
echo "Last fruit: ${fruits[-1]}"
echo "All fruits:"
for fruit in "${fruits[@]}"; do
    echo "  - $fruit"
done

# Associative arrays (Bash 4+)
declare -A person
person[name]="John Doe"
person[age]=30
person[city]="New York"

echo "Person information:"
for key in "${!person[@]}"; do
    echo "  $key: ${person[$key]}"
done

# Command line arguments
echo "Script name: $0"
echo "Number of arguments: $#"
echo "All arguments: $*"
echo "Arguments as array: ${@}"

if [ $# -gt 0 ]; then
    echo "First argument: $1"
    echo "Second argument: $2"
else
    echo "No arguments provided. Usage: $0 <arg1> <arg2> ..."
fi

# Environment variables
echo "Current user: $USER"
echo "Home directory: $HOME"
echo "Current shell: $SHELL"
echo "Current path: $PWD"
echo "Hostname: $HOSTNAME"

# Control flow examples

# If-else
score=85

if [ $score -ge 90 ]; then
    grade="A"
elif [ $score -ge 80 ]; then
    grade="B"
elif [ $score -ge 70 ]; then
    grade="C"
else
    grade="F"
fi

echo "Score: $score, Grade: $grade"

# Case statement
echo "Enter a day of the week:"
read day

case $day in
    Monday|monday|MONDAY)
        echo "It's Monday - start of the work week!"
        ;;
    Friday|friday|FRIDAY)
        echo "It's Friday - almost weekend!"
        ;;
    Saturday|saturday|SATURDAY|Sunday|sunday|SUNDAY)
        echo "It's weekend! Time to relax!"
        ;;
    *)
        echo "It's a regular weekday."
        ;;
esac

# Loop examples
echo "For loop with range:"
for i in {1..10}; do
    echo -n "$i "
done
echo

echo "While loop:"
counter=1
while [ $counter -le 5 ]; do
    echo "Counter: $counter"
    ((counter++))
done

echo "Until loop:"
counter=5
until [ $counter -le 0 ]; do
    echo "Countdown: $counter"
    ((counter--))
done

# String operations
text="Hello, World!"
echo "Original: $text"
echo "Upper case: ${text^^}"
echo "Lower case: ${text,,}"
echo "Replace World with Bash: ${text/World/Bash}"
echo "Substring (first 5 chars): ${text:0:5}"
echo "Length: ${#text}"

# File operations
echo "File operations:"

# Create a file
echo "This is a test file." > test.txt
echo "Second line." >> test.txt

# Check if file exists
if [ -f "test.txt" ]; then
    echo "test.txt exists"
    echo "File size: $(wc -c < test.txt) bytes"
    echo "Number of lines: $(wc -l < test.txt)"
fi

# Read file line by line
echo "Reading file line by line:"
while IFS= read -r line; do
    echo "Line: $line"
done < test.txt

# Clean up
rm -f test.txt

# Function with return value
add() {
    local result=$(( $1 + $2 ))
    echo $result
}

sum=$(add 15 25)
echo "Function result: 15 + 25 = $sum"

# Function with multiple return values
get_user_info() {
    echo "John Doe"    # First return value
    echo "30"          # Second return value
    echo "Developer"   # Third return value
}

# Read multiple return values
read -r user_name user_age user_job <<< "$(get_user_info)"
echo "User: $user_name, Age: $user_age, Job: $user_job"

# Error handling
echo "Error handling examples:"

# Safe file operations
safe_file_read() {
    local file="$1"
    if [ ! -f "$file" ]; then
        echo "Error: File '$file' does not exist" >&2
        return 1
    fi
    echo "Reading file: $file"
    cat "$file"
}

# Try to read a file that doesn't exist
safe_file_read "nonexistent.txt" || echo "Failed to read file"

# Exit codes
echo "Script will exit with code 0 (success)"
exit 0

💻 Bash Systemverwaltung bash

🟡 intermediate ⭐⭐⭐⭐

Praktische Bash-Scripts für Systemüberwachung, Dateiverwaltung und Serververwaltung

⏱️ 25 min 🏷️ bash, sysadmin, monitoring, automation, devops
Prerequisites: Bash basics, Linux/Unix system knowledge, Command line experience
#!/bin/bash

# Bash System Administration Examples

# 1. System Information Script
system_info() {
    echo "=== System Information ==="
    echo "Hostname: $(hostname)"
    echo "Operating System: $(uname -s) $(uname -r)"
    echo "Architecture: $(uname -m)"
    echo "Uptime: $(uptime -p)"
    echo "Current Date: $(date)"
    echo ""

    echo "=== Hardware Information ==="
    echo "CPU Model: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
    echo "CPU Cores: $(nproc)"
    echo "Memory Usage:"
    free -h
    echo ""

    echo "=== Disk Usage ==="
    df -h
    echo ""

    echo "=== Network Interfaces ==="
    ip addr show | grep -E '^[0-9]+:' | while read line; do
        interface=$(echo $line | cut -d: -f2 | xargs)
        echo "Interface: $interface"
        ip addr show "$interface" | grep 'inet ' | head -1
    done
}

# 2. Process Monitoring Script
monitor_processes() {
    echo "=== Process Monitoring ==="
    echo "Top 10 CPU-consuming processes:"
    ps aux --sort=-%cpu | head -11
    echo ""

    echo "Top 10 Memory-consuming processes:"
    ps aux --sort=-%mem | head -11
    echo ""

    echo "System Load Average:"
    uptime | awk -F'load average:' '{print $2}'
    echo ""

    echo "Running services:"
    systemctl list-units --type=service --state=running | head -10
}

# 3. Log File Monitor
monitor_logs() {
    LOG_DIR="/var/log"
    LOG_FILES=("auth.log" "syslog" "kern.log" "messages")

    echo "=== Log File Analysis ==="

    for logfile in "${LOG_FILES[@]}"; do
        if [ -f "$LOG_DIR/$logfile" ]; then
            echo "--- $logfile ---"
            echo "Size: $(du -h "$LOG_DIR/$logfile" | cut -f1)"
            echo "Last modified: $(stat -c %y "$LOG_DIR/$logfile")"
            echo "Recent entries (last 5):"
            tail -5 "$LOG_DIR/$logfile" 2>/dev/null | grep -v '^$' | head -5
            echo ""
        fi
    done

    # Check for error patterns in logs
    echo "=== Recent Error Patterns ==="
    for logfile in "${LOG_FILES[@]}"; do
        if [ -f "$LOG_DIR/$logfile" ]; then
            error_count=$(grep -c -i "error|fail|critical" "$LOG_DIR/$logfile" 2>/dev/null || echo 0)
            if [ $error_count -gt 0 ]; then
                echo "$logfile: $error_count error/fail entries found"
            fi
        fi
    done
}

# 4. Backup Script with Rotation
create_backup() {
    SOURCE_DIR="$1"
    BACKUP_DIR="$2"
    DAYS_TO_KEEP=7

    if [ -z "$SOURCE_DIR" ] || [ -z "$BACKUP_DIR" ]; then
        echo "Usage: $0 <source_directory> <backup_directory>"
        return 1
    fi

    # Create backup directory if it doesn't exist
    mkdir -p "$BACKUP_DIR"

    # Create timestamp
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.tar.gz"

    echo "Creating backup of $SOURCE_DIR..."

    # Create backup
    tar -czf "$BACKUP_FILE" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"

    if [ $? -eq 0 ]; then
        echo "Backup created successfully: $BACKUP_FILE"
        echo "Backup size: $(du -h "$BACKUP_FILE" | cut -f1)"
    else
        echo "Backup failed!"
        return 1
    fi

    # Remove old backups
    echo "Removing backups older than $DAYS_TO_KEEP days..."
    find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +$DAYS_TO_KEEP -delete

    echo "Backup rotation completed."
    echo "Current backups:"
    ls -lh "$BACKUP_DIR"/backup_*.tar.gz 2>/dev/null || echo "No backups found"
}

# 5. Service Management Script
manage_service() {
    local service="$1"
    local action="$2"

    if [ -z "$service" ] || [ -z "$action" ]; then
        echo "Usage: $0 <service_name> <start|stop|restart|status|enable|disable>"
        return 1
    fi

    echo "Managing service: $service"

    case $action in
        start|stop|restart|status)
            echo "Executing: systemctl $action $service"
            systemctl "$action" "$service"
            ;;
        enable|disable)
            echo "Executing: systemctl $action $service"
            systemctl "$action" "$service"
            ;;
        *)
            echo "Invalid action: $action"
            echo "Valid actions: start, stop, restart, status, enable, disable"
            return 1
            ;;
    esac

    if [ $? -eq 0 ]; then
        echo "Service $action completed successfully"
    else
        echo "Service $action failed"
        return 1
    fi
}

# 6. File System Cleanup Script
cleanup_system() {
    echo "=== System Cleanup ==="

    # Clear package cache (Debian/Ubuntu)
    if command -v apt &>/dev/null; then
        echo "Cleaning APT cache..."
        apt-get clean
        echo "Removing old packages..."
        apt-get autoremove -y
    fi

    # Clear package cache (RHEL/CentOS)
    if command -v yum &>/dev/null; then
        echo "Cleaning YUM cache..."
        yum clean all
    fi

    # Clear temporary files
    echo "Cleaning temporary files..."
    find /tmp -type f -atime +7 -delete 2>/dev/null || true

    # Clear user cache
    echo "Cleaning user cache files..."
    find /home -name ".cache" -type d -exec find {} -type f -atime +30 -delete \; 2>/dev/null || true

    # Clear system logs (keep last 7 days)
    echo "Cleaning old system logs..."
    find /var/log -name "*.log" -type f -mtime +7 -exec truncate -s 0 {} \; 2>/dev/null || true

    # Clear journal logs
    if command -v journalctl &>/dev/null; then
        echo "Cleaning journal logs..."
        journalctl --vacuum-time=7d
    fi

    # Show disk space after cleanup
    echo "Disk space after cleanup:"
    df -h /
}

# 7. User and Group Management
manage_user() {
    local action="$1"
    local username="$2"

    case $action in
        "create")
            if [ -z "$username" ]; then
                echo "Usage: $0 create <username>"
                return 1
            fi
            echo "Creating user: $username"
            useradd -m -s /bin/bash "$username"
            echo "Setting password for $username"
            passwd "$username"
            ;;
        "delete")
            if [ -z "$username" ]; then
                echo "Usage: $0 delete <username>"
                return 1
            fi
            echo "Deleting user: $username"
            userdel -r "$username"
            ;;
        "list")
            echo "System users:"
            cat /etc/passwd | cut -d: -f1 | sort
            ;;
        *)
            echo "Usage: $0 <create|delete|list> [username]"
            return 1
            ;;
    esac
}

# 8. Network Monitoring Script
monitor_network() {
    echo "=== Network Monitoring ==="

    # Show active connections
    echo "Active network connections:"
    netstat -tuln | grep LISTEN

    echo ""
    echo "Network interfaces:"
    ip addr show

    echo ""
    echo "Network statistics:"
    cat /proc/net/dev

    echo ""
    echo "Routing table:"
    ip route show

    echo ""
    echo "DNS servers:"
    cat /etc/resolv.conf

    # Test connectivity
    echo ""
    echo "Connectivity test:"
    if ping -c 1 8.8.8.8 &>/dev/null; then
        echo "✓ Internet connectivity OK"
    else
        echo "✗ Internet connectivity FAILED"
    fi
}

# 9. Security Audit Script
security_audit() {
    echo "=== Security Audit ==="

    # Check for sudo users
    echo "Users with sudo privileges:"
    grep -E "sudo|wheel" /etc/group

    echo ""
    echo "Recent login attempts:"
    last -n 10

    echo ""
    echo "Failed login attempts:"
    grep "Failed password" /var/log/auth.log 2>/dev/null | tail -10 || \
    grep "authentication failure" /var/log/secure 2>/dev/null | tail -10 || echo "No failed login attempts found"

    echo ""
    echo "Open ports:"
    netstat -tuln | grep LISTEN

    echo ""
    echo "SSH configuration:"
    if [ -f /etc/ssh/sshd_config ]; then
        echo "Root login: $(grep -i "^PermitRootLogin" /etc/ssh/sshd_config || echo "Not configured")"
        echo "Password authentication: $(grep -i "^PasswordAuthentication" /etc/ssh/sshd_config || echo "Not configured")"
        echo "Port: $(grep -i "^Port" /etc/ssh/sshd_config || echo "Default (22)")"
    fi

    # Check file permissions
    echo ""
    echo "Important file permissions:"
    echo "/etc/passwd: $(ls -l /etc/passwd | cut -d' ' -f1)"
    echo "/etc/shadow: $(ls -l /etc/shadow | cut -d' ' -f1)"
    echo "/etc/sudoers: $(ls -l /etc/sudoers | cut -d' ' -f1)"
}

# 10. Automated Updates Script
system_update() {
    echo "=== System Update ==="

    # Check update method based on distribution
    if [ -f /etc/debian_version ]; then
        # Debian/Ubuntu
        echo "Detected Debian-based system"
        echo "Updating package list..."
        apt-get update

        echo "Checking for available updates..."
        apt list --upgradable 2>/dev/null | grep -v "WARNING" | wc -l

        echo "Upgrading packages..."
        DEBIAN_FRONTEND=noninteractive apt-get upgrade -y

        echo "Installing security updates..."
        DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y

    elif [ -f /etc/redhat-release ]; then
        # RHEL/CentOS/Fedora
        echo "Detected Red Hat-based system"
        echo "Updating packages..."
        yum update -y

        echo "Installing security updates..."
        yum update --security -y

    else
        echo "Unsupported distribution for automatic updates"
        return 1
    fi

    echo "Update completed successfully"
}

# Main script execution
if [ "${BASH_SOURCE[0]}" == "${0}" ]; then
    case "${1:-help}" in
        "info")
            system_info
            ;;
        "monitor")
            monitor_processes
            ;;
        "logs")
            monitor_logs
            ;;
        "backup")
            create_backup "${2:-}" "${3:-}"
            ;;
        "service")
            manage_service "${2:-}" "${3:-}"
            ;;
        "cleanup")
            cleanup_system
            ;;
        "user")
            manage_user "${2:-}" "${3:-}"
            ;;
        "network")
            monitor_network
            ;;
        "security")
            security_audit
            ;;
        "update")
            system_update
            ;;
        "help"|*)
            echo "System Administration Script"
            echo "Usage: $0 <command> [options]"
            echo ""
            echo "Commands:"
            echo "  info                    - Show system information"
            echo "  monitor                 - Monitor processes and system load"
            echo "  logs                    - Analyze log files"
            echo "  backup <source> <dest>  - Create backup with rotation"
            echo "  service <name> <action> - Manage systemd services"
            echo "  cleanup                 - Clean system temporary files"
            echo "  user <action> [name]    - Manage users (create/delete/list)"
            echo "  network                 - Monitor network status"
            echo "  security                - Perform security audit"
            echo "  update                  - Update system packages"
            echo "  help                    - Show this help"
            ;;
    esac
fi

💻 Bash DevOps-Automatisierung bash

🔴 complex ⭐⭐⭐⭐⭐

Fortgeschrittene Bash-Scripts für CI/CD, Deployment-Automatisierung und DevOps-Workflows

⏱️ 40 min 🏷️ bash, devops, cicd, docker, automation, infrastructure
Prerequisites: Advanced Bash, DevOps concepts, Docker knowledge, CI/CD understanding
#!/bin/bash

# Bash DevOps and Automation Examples

# 1. Docker Container Management
docker_management() {
    local action="${1:-list}"

    case $action in
        "list")
            echo "=== Docker Containers ==="
            docker ps -a
            echo ""
            echo "=== Docker Images ==="
            docker images
            echo ""
            echo "=== Docker Volumes ==="
            docker volume ls
            ;;
        "stats")
            echo "=== Container Resource Usage ==="
            docker stats --no-stream
            ;;
        "cleanup")
            echo "=== Docker Cleanup ==="
            echo "Removing stopped containers..."
            docker container prune -f
            echo "Removing unused images..."
            docker image prune -f
            echo "Removing unused volumes..."
            docker volume prune -f
            ;;
        "build")
            local image_name="${2:-myapp}"
            local dockerfile_path="${3:-.}"

            echo "Building Docker image: $image_name"
            docker build -t "$image_name" "$dockerfile_path"

            if [ $? -eq 0 ]; then
                echo "✓ Docker image built successfully"
                docker images | grep "$image_name"
            else
                echo "✗ Docker build failed"
                return 1
            fi
            ;;
        *)
            echo "Usage: $0 <list|stats|cleanup|build> [image_name] [dockerfile_path]"
            return 1
            ;;
    esac
}

# 2. Git Automation Script
git_automation() {
    local action="${1:-status}"

    case $action in
        "status")
            echo "=== Git Repository Status ==="
            echo "Current branch: $(git branch --show-current)"
            echo "Remote: $(git remote get-url origin 2>/dev/null || echo "No remote")"
            echo ""
            echo "Changes to be committed:"
            git diff --cached --stat
            echo ""
            echo "Changes not staged:"
            git diff --stat
            echo ""
            echo "Untracked files:"
            git ls-files --others --exclude-standard
            ;;
        "auto-commit")
            local commit_message="${2:-Auto-commit $(date)}"

            echo "=== Auto Commit Process ==="

            # Add all changes
            echo "Adding all changes..."
            git add .

            # Check if there are changes to commit
            if git diff --cached --quiet; then
                echo "No changes to commit"
                return 0
            fi

            # Commit changes
            echo "Committing changes..."
            git commit -m "$commit_message"

            # Push to remote if exists
            if git remote get-url origin &>/dev/null; then
                echo "Pushing to remote..."
                git push
            fi

            echo "✓ Auto-commit completed"
            ;;
        "branch-cleanup")
            echo "=== Branch Cleanup ==="

            # Fetch latest from remote
            git fetch --prune

            # List merged branches
            echo "Merged branches (excluding main/master):"
            git branch --merged | grep -v "\*" | grep -v "main\|master" | while read branch; do
                echo "  $branch"
            done

            # Ask for confirmation
            read -p "Delete merged branches? (y/N): " confirm
            if [[ $confirm =~ ^[Yy]$ ]]; then
                git branch --merged | grep -v "\*" | grep -v "main\|master" | xargs -r git branch -d
                echo "✓ Merged branches deleted"
            fi
            ;;
        "release")
            local version="${2:-v$(date +%Y%m%d)}"

            echo "=== Creating Release: $version ==="

            # Create and push tag
            git tag -a "$version" -m "Release $version"
            git push origin "$version"

            echo "✓ Release tag $version created and pushed"
            ;;
        *)
            echo "Usage: $0 <status|auto-commit|branch-cleanup|release> [options]"
            return 1
            ;;
    esac
}

# 3. Deployment Script
deploy_application() {
    local app_name="${1:-myapp}"
    local environment="${2:-staging}"
    local version="${3:-latest}"

    echo "=== Deploying $app_name to $environment ==="
    echo "Version: $version"
    echo "Deployment started at: $(date)"

    # Pre-deployment checks
    echo "Running pre-deployment checks..."

    # Check if required tools are available
    local required_tools=("docker" "git" "curl")
    for tool in "${required_tools[@]}"; do
        if ! command -v "$tool" &>/dev/null; then
            echo "✗ Required tool not found: $tool"
            return 1
        fi
    done
    echo "✓ All required tools are available"

    # Check if Docker is running
    if ! docker info &>/dev/null; then
        echo "✗ Docker is not running"
        return 1
    fi
    echo "✓ Docker is running"

    # Stop existing container if exists
    echo "Stopping existing container..."
    docker stop "$app_name" 2>/dev/null || true
    docker rm "$app_name" 2>/dev/null || true

    # Pull latest image
    echo "Pulling Docker image: $app_name:$version"
    docker pull "$app_name:$version"

    if [ $? -ne 0 ]; then
        echo "✗ Failed to pull Docker image"
        return 1
    fi

    # Start new container
    echo "Starting new container..."
    docker run -d \
        --name "$app_name" \
        --restart unless-stopped \
        -p 8080:8080 \
        -e "ENVIRONMENT=$environment" \
        -e "VERSION=$version" \
        -v "/opt/$app_name/logs:/app/logs" \
        "$app_name:$version"

    if [ $? -ne 0 ]; then
        echo "✗ Failed to start container"
        return 1
    fi

    # Health check
    echo "Performing health check..."
    sleep 10

    local health_check_url="http://localhost:8080/health"
    local max_attempts=30
    local attempt=1

    while [ $attempt -le $max_attempts ]; do
        if curl -f "$health_check_url" &>/dev/null; then
            echo "✓ Health check passed"
            break
        fi

        if [ $attempt -eq $max_attempts ]; then
            echo "✗ Health check failed after $max_attempts attempts"
            echo "Container logs:"
            docker logs "$app_name"
            return 1
        fi

        echo "Health check attempt $attempt/$max_attempts..."
        sleep 2
        ((attempt++))
    done

    # Post-deployment
    echo "Deployment completed successfully!"
    echo "Container status:"
    docker ps | grep "$app_name"

    # Create deployment record
    local deploy_log="/opt/$app_name/deployments.log"
    mkdir -p "/opt/$app_name"
    echo "$(date): Deployed $app_name version $version to $environment" >> "$deploy_log"
    echo "Deployment logged to: $deploy_log"
}

# 4. CI/CD Pipeline Script
cicd_pipeline() {
    local stage="${1:-build}"
    local project_name="${2:-myproject}"

    echo "=== CI/CD Pipeline: $stage ==="
    echo "Project: $project_name"
    echo "Stage: $stage"
    echo "Timestamp: $(date)"

    case $stage in
        "build")
            echo "=== Build Stage ==="

            # Set environment variables
            export CI=true
            export BUILD_NUMBER="${BUILD_NUMBER:-$(date +%s)}"
            export COMMIT_SHA="${COMMIT_SHA:-$(git rev-parse HEAD 2>/dev/null || echo 'unknown')}"

            # Clean previous builds
            echo "Cleaning previous builds..."
            rm -rf dist/ build/ target/ || true

            # Install dependencies
            if [ -f "package.json" ]; then
                echo "Installing Node.js dependencies..."
                npm ci
            elif [ -f "requirements.txt" ]; then
                echo "Installing Python dependencies..."
                pip install -r requirements.txt
            elif [ -f "pom.xml" ]; then
                echo "Building with Maven..."
                mvn clean compile
            elif [ -f "build.gradle" ]; then
                echo "Building with Gradle..."
                ./gradlew build
            fi

            # Run tests
            echo "Running tests..."
            if [ -f "package.json" ] && npm run test --silent; then
                echo "✓ Tests passed"
            elif [ -f "requirements.txt" ] && python -m pytest; then
                echo "✓ Tests passed"
            elif [ -f "pom.xml" ] && mvn test; then
                echo "✓ Tests passed"
            else
                echo "✗ Tests failed"
                return 1
            fi

            # Build application
            echo "Building application..."
            if [ -f "package.json" ] && npm run build; then
                echo "✓ Build completed"
            elif [ -f "Dockerfile" ] && docker build -t "$project_name:$BUILD_NUMBER" .; then
                echo "✓ Docker image built"
            else
                echo "✗ Build failed"
                return 1
            fi

            echo "✓ Build stage completed successfully"
            ;;
        "test")
            echo "=== Test Stage ==="

            # Run unit tests
            echo "Running unit tests..."
            if command -v pytest &>/dev/null; then
                pytest --junitxml=test-results.xml
            elif command -v npm &>/dev/null; then
                npm test -- --coverage --reporter=junit
            else
                echo "No test runner found"
            fi

            # Run integration tests
            echo "Running integration tests..."
            if [ -d "tests/integration" ]; then
                # Integration test logic here
                echo "✓ Integration tests passed"
            fi

            # Security scan
            echo "Running security scan..."
            if command -v npm &>/dev/null && npm audit --audit-level=high; then
                echo "✓ Security scan passed"
            fi

            echo "✓ Test stage completed successfully"
            ;;
        "deploy")
            local environment="${3:-staging}"
            echo "=== Deploy Stage: $environment ==="

            # Deploy based on environment
            if [ "$environment" = "production" ]; then
                echo "Deploying to production..."
                deploy_application "$project_name" "production"
            else
                echo "Deploying to staging..."
                deploy_application "$project_name" "staging"
            fi

            echo "✓ Deploy stage completed successfully"
            ;;
        *)
            echo "Usage: $0 <build|test|deploy> <project_name> [environment]"
            return 1
            ;;
    esac
}

# 5. Monitoring and Alerting Script
monitor_and_alert() {
    local service="${1:-web}"
    local url="${2:-http://localhost:8080/health}"
    local alert_email="${3:[email protected]}"
    local log_file="/var/log/monitor.log"

    echo "=== Monitoring: $service ==="
    echo "URL: $url"
    echo "Alert email: $alert_email"

    # Create log directory
    mkdir -p "$(dirname "$log_file")"

    # Check service health
    echo "Checking service health..."
    local response_code=$(curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)

    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')

    if [ "$response_code" = "200" ]; then
        echo "[$timestamp] ✓ $service is healthy (HTTP $response_code)" | tee -a "$log_file"

        # Check response time
        local response_time=$(curl -s -o /dev/null -w "%{time_total}" "$url")
        echo "Response time: ${response_time}s"

        # Alert if response time is too slow
        if (( $(echo "$response_time > 2.0" | bc -l) )); then
            echo "[$timestamp] ⚠ $service response time is slow: ${response_time}s" | tee -a "$log_file"
            echo "Slow response alert sent to $alert_email"
        fi

    else
        echo "[$timestamp] ✗ $service is unhealthy (HTTP $response_code)" | tee -a "$log_file"

        # Send alert email (requires mail command)
        if command -v mail &>/dev/null; then
            echo "Service $service is down! HTTP response code: $response_code" | \
                mail -s "ALERT: $service service down" "$alert_email"
        fi

        # Check if service needs restart
        echo "Attempting to restart service..."
        if command -v docker &>/dev/null; then
            docker restart "$service" 2>/dev/null || systemctl restart "$service" 2>/dev/null || true
        fi
    fi
}

# Main script execution
if [ "${BASH_SOURCE[0]}" == "${0}" ]; then
    case "${1:-help}" in
        "docker")
            docker_management "${2:-}" "${3:-}" "${4:-}"
            ;;
        "git")
            git_automation "${2:-}" "${3:-}" "${4:-}"
            ;;
        "deploy")
            deploy_application "${2:-}" "${3:-}" "${4:-}"
            ;;
        "cicd")
            cicd_pipeline "${2:-}" "${3:-}" "${4:-}"
            ;;
        "monitor")
            monitor_and_alert "${2:-}" "${3:-}" "${4:-}"
            ;;
        "help"|*)
            echo "DevOps Automation Script"
            echo "Usage: $0 <command> [options]"
            echo ""
            echo "Commands:"
            echo "  docker <action> [options]    - Docker container management"
            echo "  git <action> [options]       - Git repository automation"
            echo "  deploy <app> <env> <version> - Application deployment"
            echo "  cicd <stage> <project> [env] - CI/CD pipeline automation"
            echo "  monitor <service> <url>      - Service monitoring and alerting"
            echo "  help                         - Show this help"
            ;;
    esac
fi