Files
it-know-how/Computerkram/Linux/BASH Skripte/BASH Skript mit Argumenten und Weiterleitung.md
T
2026-03-27 12:41:00 +01:00

4.5 KiB

Grundlegendes Vorgehen

Ein BASH Skript, das Argumente verarbeitet und weiterleitet, folgt diesem Muster:

#!/bin/bash

# Standardwerte definieren
DEFAULT_VALUE="standard"
VERBOSE=false
TARGET_SCRIPT="./target-script.sh"

# Argumente parsen
while [[ $# -gt 0 ]]; do
    case $1 in
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        -f|--file)
            FILE="$2"
            shift 2
            ;;
        -o|--output)
            OUTPUT="${2:-$DEFAULT_VALUE}"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            # Unbekannte Argumente sammeln
            UNKNOWN_ARGS+=("$1")
            shift
            ;;
    esac
done

# Alle Argumente an Zielskript weiterleiten
"$TARGET_SCRIPT" "${UNKNOWN_ARGS[@]}"

Verschiedene Weiterleitungsstrategien

1. Alle Argumente 1:1 weiterleiten

#!/bin/bash
./target-script.sh "$@"

2. Selektive Weiterleitung

#!/bin/bash

# Lokale Verarbeitung
WRAPPER_OPTION=""
TARGET_ARGS=()

while [[ $# -gt 0 ]]; do
    case $1 in
        --wrapper-only)
            WRAPPER_OPTION="$2"
            shift 2
            ;;
        *)
            TARGET_ARGS+=("$1")
            shift
            ;;
    esac
done

# Nur relevante Argumente weiterleiten
./target-script.sh "${TARGET_ARGS[@]}"

3. Argumente transformieren

#!/bin/bash

TRANSFORMED_ARGS=()

for arg in "$@"; do
    case $arg in
        --old-format)
            TRANSFORMED_ARGS+=("--new-format")
            ;;
        *)
            TRANSFORMED_ARGS+=("$arg")
            ;;
    esac
done

./target-script.sh "${TRANSFORMED_ARGS[@]}"

Erweiterte Techniken

Standardwerte und Validierung

#!/bin/bash

# Standardwerte
CONFIG_FILE="${CONFIG_FILE:-/etc/default/myapp}"
LOG_LEVEL="${LOG_LEVEL:-INFO}"
DRY_RUN=false

# Hilfsfunktion
show_help() {
    cat << EOF
Usage: $0 [OPTIONS] -- [TARGET_ARGS]

OPTIONS:
    -c, --config FILE    Konfigurationsdatei (default: $CONFIG_FILE)
    -l, --log-level LVL  Log Level (default: $LOG_LEVEL)
    -n, --dry-run        Nur Simulation
    -h, --help           Diese Hilfe

Alle Argumente nach -- werden an das Zielskript weitergegeben.
EOF
}

# Parsing mit -- Separator
TARGET_ARGS=()
PARSE_TARGET=false

while [[ $# -gt 0 ]]; do
    if [[ "$PARSE_TARGET" == true ]]; then
        TARGET_ARGS+=("$1")
        shift
        continue
    fi
    
    case $1 in
        -c|--config)
            CONFIG_FILE="$2"
            shift 2
            ;;
        -l|--log-level)
            LOG_LEVEL="$2"
            shift 2
            ;;
        -n|--dry-run)
            DRY_RUN=true
            shift
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        --)
            PARSE_TARGET=true
            shift
            ;;
        *)
            echo "Unbekannte Option: $1" >&2
            show_help
            exit 1
            ;;
    esac
done

# Validierung
if [[ ! -f "$CONFIG_FILE" ]]; then
    echo "Konfigurationsdatei nicht gefunden: $CONFIG_FILE" >&2
    exit 1
fi

# Ausführung
if [[ "$DRY_RUN" == true ]]; then
    echo "DRY RUN: ./target-script.sh ${TARGET_ARGS[*]}"
else
    ./target-script.sh "${TARGET_ARGS[@]}"
fi

Best Practices

1. Sichere Argumentbehandlung

# Verwende Arrays für Argumente
ARGS=()
while IFS= read -r -d '' arg; do
    ARGS+=("$arg")
done < <(printf '%s\0' "$@")

# Sichere Weiterleitung
./target-script.sh "${ARGS[@]}"

2. Logging und Debugging

#!/bin/bash

DEBUG=${DEBUG:-false}

debug_log() {
    if [[ "$DEBUG" == true ]]; then
        echo "DEBUG: $*" >&2
    fi
}

debug_log "Received arguments: $*"
debug_log "Passing to target: ${TARGET_ARGS[*]}"

3. Fehlerbehandlung

#!/bin/bash

set -euo pipefail  # Strict mode

# Trap für Cleanup
cleanup() {
    debug_log "Cleaning up..."
}
trap cleanup EXIT

# Prüfe ob Zielskript existiert
if [[ ! -x "$TARGET_SCRIPT" ]]; then
    echo "Fehler: Zielskript '$TARGET_SCRIPT' nicht gefunden oder nicht ausführbar" >&2
    exit 1
fi

# Führe aus und fange Exit-Code ab
if "$TARGET_SCRIPT" "$@"; then
    debug_log "Zielskript erfolgreich ausgeführt"
else
    exit_code=$?
    echo "Zielskript fehlgeschlagen mit Exit-Code: $exit_code" >&2
    exit $exit_code
fi

Verwandte Konzepte


Tags: #bash #scripting #arguments #shell #automation