Warum funktioniert diese Option in diesem Bash-Skript nicht?

Warum funktioniert diese Option in diesem Bash-Skript nicht?

Ich erweitere die folgende Funktion um die Option -i | --ignore-casemit Fehlerbehandlung

#!/bin/sh
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -

Erweiterter Code

#!/bin/sh
################################
# Check if parameters options  #
# are given on the commandline #
################################
while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        find $HOME -type f -name "*.tex" -exec grep -il "$1" {} + | vim -
        exit 0
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

# Do this if no cases chosen
[ $# -ne 1 ] && echo "1 argument is needed" && exit 1
find $HOME -type f -name "*.tex" -exec grep -l "$1" {} + | vim -

Ergebnis

  1. haetex "TODO". Die erwartete Ausgabe ist die gleiche wie die Ausgabe. Bestanden!
  2. haetex -i "TODO". Erwartetes Ergebnis: Suche ohne Berücksichtigung der Groß- und Kleinschreibung. Ergebnis: leere Datei.

-iWarum funktioniert die Option hier nicht?

Antwort1

grepÄndern Sie in der Groß-/Kleinschreibung das in die -iSuche nach $2, da $1dieses die gerade getestete Option enthält und nicht den Suchbegriff.

find $HOME -type f -name "*.tex" -exec grep -il "$2" {} + | vim -

Um mehrere Optionen zu verarbeiten, wäre es besser, wenn die caseAnweisung einfach eine Variable setzt, z. B.

-i | --ignore-case)
    [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
    case_option=-i
    ;;

Dann findwürde der Befehl nach der Schleife so aussehen:

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

In diesem Fall kann es verwendet werden $1, da der shiftSuchbegriff an den Anfang der Argumente verschoben wurde.

Das gesamte Skript sieht also folgendermaßen aus:

while (( "$#" )); do
   case "$1" in
    -h | --help)
        echo "help menu"
        exit 0
        ;;
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "1 argumenst i needed" && exit 1
        case_option=-i
        ;;
     -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
      *) # No more options
        break
        ;;
   esac

   shift # not sure if needed
done

find $HOME -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -

verwandte Informationen