Arg-Behandlung in einem Skript für eine modifizierte „Find“-Funktion?

Arg-Behandlung in einem Skript für eine modifizierte „Find“-Funktion?

Ich verwende FreeBSD und verstehe und verwende die -pruneOption „on“, findum zu verhindern, dass der Befehl in ein Unterverzeichnis wechselt. Aber ich finde die erforderliche Syntax sehr umständlich und unpraktisch. Es verhindert auch nicht, dass das beschnittene Verzeichnis selbst angezeigt wird, was zwar behebbar, aber ärgerlich ist.

Ich möchte ein kurzes Skript/Alias ​​erstellen, das -noenterdem findBefehl ein neues Argument hinzufügtWennEs wird (der Einfachheit halber) vor allen anderen Vorwahlen angegeben.

Das Ziel besteht darin, dass ich Folgendes eingeben kann:

  • find -xs /dir -noenter '$*' -name '*.conf' -ls
  • find -x -s /dir -noenter '$*' -name '*.conf' -ls

und es konvertiert die Argumente und führt aus:

  • /usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
  • /usr/bin/find -x -s /dir \( SNIPPED \) -ls

ich kann aber auch wie gewohnt einen beliebigen Routinebefehl „find“ eingeben und dieser wird transparent zur /usr//bin/findAusführung weitergeleitet.

Logischerweise muss das Skript das erste Argument nach dem Verzeichnisnamen identifizieren und dann testen, ob es Folgendes ist:

  • ... gleich -noenterund gefolgt von mindestens 2 weiteren Argumenten (in diesem Fall weiß ich, wie ich das Argument erstelle, an das ich übergeben muss, /usr/bin/findda ich weiß, welche Argumente davor/danach kamen);oder
  • ... gleich, -noenteraber nicht gefolgt von mindestens 2 weiteren Argumenten (= Fehler);oder
  • … alles andere oder Verzeichnis war das letzte Argument oder wurde nicht gefunden (= gesamte Originalargumente unverändert übergeben /usr/bin/find).

Ich kann das alles tun, bis auf eine Sache: Wie codiere ich den Teil des Skripts, der argv untersucht, um festzustellen, welche Argumentnummer (falls vorhanden) das dirArgument ist?

Ich wähle eine Shell shfür Skripting.

Antwort1

Wenn Sie die Existenz und Position eines bestimmten Arguments testen möchten, müssen Sie nur die Befehlszeile analysieren und jedes Argument auf eine Übereinstimmung mit Ihrem „erwarteten“ Wert prüfen. Sie müssen also jedes Argument auf den Wert testen -noenterund dann eine Zeile drucken, die die Position und den Namen der Variable angibt -noenter:

for i in `seq 1 $#`; do
    ref=`eval "echo \\$$i"`
    if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done

Jetzt das Gleiche, nur wird die Position des Arguments -noenterin gespeichert $mitsosund die Position des Arguments davor in $mary:

for i in `seq 1 $#`; do
  ref=`eval "echo \\${$i}"`
  if [ $ref == '-noenter' ]; then
    mitsos=$i
    eva=$(($i-1))
    mary=`eval "echo \\${$eva}"`
    break
  fi
done

und $mitsoshat jetzt die Position von -noenteroder keinen Wert und $maryden Wert des Arguments vor -noenter. An diesem Punkt $maryhat if den Wert , /dirden Siewissendas nächste Argument ist -noenterund Sie können mit Ihrer Implementierung von fortfahren find, andernfalls verwenden Sie die Version des Systems oder drucken eine Fehlermeldung. Wenn Ihnen die Position von egal ist, -noenterkönnen Sie die Zeile weglassen mitsos=$i.

verwandte Informationen