Fehler beim Suchen bei Verwendung von -newerct-Werten, die in Variablen gespeichert sind

1

Ich versuche, eine Bash-Funktion zu erstellen, die eine einfache Datei wie z

sample.txt

start=22 Mar 2016 10:00
end=22 Mar 2016 12:09

... und finde Dateien, die ich in / usr / local innerhalb des durch start und end festgelegten Zeitraums installiert habe.

Die Funktion, die ich ursprünglich erstellt habe, ist:

function findInstalled () {
  if [[ $# -ne 1 ]]; then
    echo "[ERROR] Usage: findInstalled /path/to/file" ;
    return 1;
  fi

  start=$( grep start $1 | cut -d'=' -f2 ) ;
  end=$( grep end $1 | cut -d'=' -f2 ) ;

  if [[ ! -z $start ]]; then
    start="-newerct \"${start}\"" ;
  fi

  if [[ ! -z $end ]]; then 
    end="! -newerct \"${end}\"" ;
  fi
  echo find /usr/local $start $end -type f ;
  find /usr/local $start $end -type f ;
}

..und die Ausführung der Funktion ergibt folgende Ausgabe:

$ findInstalled /path/to/sample.txt
find /usr/local -newerct "22 Mar 2016 10:00" ! -newerct "22 Mar 2016 12:09" -type f
find: I cannot figure out how to interpret `"22' as a date or time

Die tatsächliche Ausführung des Befehls gibt den Fehler an ...cannot figure out how to interpret.... Wenn ich jedoch die Echo-Version des Befehls kopiere und einfüge, wird der Befehl erfolgreich ausgeführt. Irgendeine Idee, wo das Problem liegt? Beachten Sie, dass ich mit und ohne alle möglichen Kombinationen von Doppel-Qoutes und Einzel-Qoutes ausprobiert habe und keine davon funktioniert hat.

Ich habe die Funktion aktiviert, obwohl nicht ganz so, wie ich es wollte, indem ich stattdessen Folgendes mache:

function findInstalled () {
  if [[ $# -ne 1 ]]; then
    echo "[ERROR] Usage: findInstalled /path/to/file"
    return 1;
  fi

  start=$( grep start $1 | cut -d'=' -f2 ) ;
  end=$( grep end $1 | cut -d'=' -f2 ) ;

  find /usr/local -newerct "$start" ! -newerct "$end" -type f ;
}

Auf diese Weise habe ich mein ursprüngliches Ziel erreicht, aber ich bin gespannt, warum meine ursprüngliche Funktion nicht funktioniert oder ob es überhaupt möglich ist.

zhdason
quelle

Antworten:

1

Das Problem ist, wie die Shell die Zeile in Token aufteilt. Es dehnt $startsich aus -newerct "22 Mar 2016 10:00"und teilt dann Wörter in Leerzeichen auf. So findwird die folgenden Argumente übergeben: -newerct, "22, Marusw. daher die Fehlermeldung. man bashZustände:

Die Reihenfolge der Erweiterungen lautet: geschweifte Klammer, Tilde, Parameter, Variable und arithmetische Erweiterung und Befehlssubstitution (von links nach rechts), Wortteilung und Pfadnamenerweiterung.

Ich bin mir nicht sicher, ob es so gemacht werden kann, wie Sie es wollten. Ihr zweites Skript ist besser lesbar, Sie müssen jedoch sicherstellen, dass die Variablen nicht null sind. Vielleicht könntest du es so machen:

find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;

L. Levrel
quelle
Vielen Dank! Die Fehlermeldung macht jetzt vollkommen Sinn, ich hatte noch nie etwas von Wortspaltung gehört und mich gefragt, warum es anscheinend "22der einzige Wert war, für den ich gesorgt hatte -newerct. Nachdem ich den Abschnitt zur Wortteilung im Bash-Handbuch gelesen hatte, versuchte ich, meine ursprüngliche Funktion zum IFSLaufen zu bringen, indem ich sie in eine temporäre Variable speicherte und tat unset IFS, aber dies funktionierte immer noch nicht. Am Ende ging ich zu Ihrem findVorschlag über, da es immer noch funktioniert, wenn Start- / Endwerte in der Quelldatei leer sind. Dies war das, was ich ursprünglich über das ! -zs erreichen wollte.
Zhdason
Ich habe ein bisschen mehr über das Teilen von Wörtern gelesen, BASHFAQ050 enthält zusätzliche Beispiele und Erklärungen.
Zhdason