Ich möchte das Ergebnis eines Ausdrucks
(d. h. die Ausgabe eines Befehls)
einer Variablen zuweisen und sie dann manipulieren – zum Beispiel
mit einer Zeichenfolge verketten und dann wiedergeben .
Folgendes habe ich:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Aber das gibt aus:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Es sieht also so aus, als ob das nicht $thefile
zugewiesen wird , und wird während der Ausführung gedruckt.
Was übersehe ich?
Akzeptierte Antwort:
Eine Shell-Zuweisung ist ein einzelnes Wort ohne Leerzeichen nach dem Gleichheitszeichen. Was Sie also geschrieben haben, weist thefile
einen leeren Wert zu; Da die Zuweisung mit einem Befehl gruppiert ist, wird außerdem thefile
erstellt eine Umgebungsvariable und die Zuweisung ist lokal für diesen bestimmten Befehl, d. h. nur der Aufruf von ls
sieht den zugewiesenen Wert.
Sie möchten die Ausgabe eines Befehls erfassen, also müssen Sie die Befehlssubstitution verwenden:
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Manche Literatur zeigt eine alternative Syntax thefile=`ls …`
; Die Backquote-Syntax entspricht der Dollar-Klammern-Syntax, außer dass das Zitieren innerhalb von Backquotes manchmal seltsam ist, also verwenden Sie einfach $(…)
.)
Weitere Anmerkungen zu Ihrem Skript:
-
Kombinieren von
-t
(nach Zeit sortieren) mit-U
(nicht mit GNUls
sortieren ) macht keinen Sinn; Verwenden Sie einfach-t
. -
Anstatt
grep
zu verwenden um Screenshots abzugleichen, ist es klarer, einen Platzhalter anls
zu übergeben und verwenden Siehead
um die erste Datei zu erfassen:thefile=$(ls -td -- *"Screen Shot"* | head -n 1)
-
Es ist im Allgemeinen keine gute Idee, die Ausgabe von
ls
zu parsen . Dies könnte ziemlich fehlschlagen, wenn Sie Dateinamen mit nicht druckbaren Zeichen haben. Das Sortieren von Dateien nach Datum ist jedoch ohnels
schwierig , daher ist es eine akzeptable Lösung, wenn Sie wissen, dass Sie keine nicht druckbaren Zeichen oder Backslashes in Dateinamen haben werden. -
Verwenden Sie immer doppelte Anführungszeichen um Variablenersetzungen , d.h. hier schreibe
echo "Most recent screenshot is: $thefile"
Ohne doppelte Anführungszeichen wird der Wert der Variablen neu erweitert, was zu Problemen führt, wenn er Leerzeichen oder andere Sonderzeichen enthält.
-
Sie brauchen kein Semikolon am Ende einer Zeile. Sie sind überflüssig, aber harmlos.
-
In einem Shell-Skript ist es oft eine gute Idee,
set -e
einzufügen . Dies weist die Shell an, sich zu beenden, wenn ein Befehl fehlschlägt (indem ein Status ungleich Null zurückgegeben wird).
Wenn Sie GNU find
haben und sort
(insbesondere wenn Sie nicht eingebettetes Linux oder Cygwin verwenden), gibt es einen anderen Ansatz, um die neueste Datei zu finden:Haben Sie find
Listen Sie die Dateien und ihre Daten auf und verwenden Sie sort
und read
(hier unter der Annahme von bash
oder zsh
für -d ''
um einen durch NUL getrennten Datensatz zu lesen), um die jüngste Datei zu extrahieren.
IFS=/ read -rd '' ignorierte die Datei <<( find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%[email protected]/%p