GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

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 GNU ls sortieren ) macht keinen Sinn; Verwenden Sie einfach -t .

  • Anstatt grep zu verwenden um Screenshots abzugleichen, ist es klarer, einen Platzhalter an ls zu übergeben und verwenden Sie head 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 ohne ls 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
Linux
  1. Ausgabe des Befehls in Shell-Variable speichern?

  2. Wie setze ich eine Variable gleich der Ausgabe eines Befehls in Grub2?

  3. Wie kann man feststellen, ob die Ausgabe eines Befehls oder Shell-Skripts Stdout oder Stderr ist?

  4. Wie speichert man einen Befehl in einer Variablen in einem Shell-Skript?

  5. Wie speichere ich das Ergebnis eines ausgeführten Shell-Befehls in einer Variablen in Python?

So führen Sie Shell-Befehle über einen HTTP-Server aus

So leiten Sie die Shell-Befehlsausgabe um

So ändern Sie die Ausgabefarbe von „Echo“ in Linux

So speichern Sie einen Linux-Befehl als Variable im Shell-Skript

Wie führe ich einen Befehl in einem Shell-Skript aus?

Die Ausgabe eines Shell-Befehls nur bei Erfolg ausblenden?