Ich habe diese Frage vergeblich gegoogelt. Ich automatisiere hier bei der Arbeit einen Build-Prozess, und alles, was ich versuche, ist, Versionsnummern und eine winzige Beschreibung des Builds abzurufen, die möglicherweise mehrzeilig sein kann. Das System, auf dem dies ausgeführt wird, ist OSX 10.6.8.
Ich habe alles von der Verwendung von CAT bis zur Verarbeitung jeder Zeile nach Bedarf gesehen. Ich kann nicht herausfinden, was ich verwenden soll und warum.
Versuche
read -d '' versionNotes
Dies führt zu unleserlichen Eingaben, wenn der Benutzer die Rücktaste verwenden muss. Es gibt auch keine gute Möglichkeit, die Eingabe zu beenden, da ^ D nicht beendet wird und ^ C nur den Prozess beendet.
read -d 'END' versionNotes
Funktioniert ... verstümmelt aber die Eingabe, wenn die Rücktaste benötigt wird.
while read versionNotes
do
echo " $versionNotes" >> "source/application.yml"
done
Beendet die Eingabe nicht ordnungsgemäß (da ich zu spät bin, um nach einer leeren Zeichenfolge zu suchen).
Antworten:
man bash
Erwähnungen «…… »
und ich stimme zu, dass dies erwähnenswert ist -
echo "$myVar"
hätte die Eingabe so angezeigt, wie sie gegeben wurde.quelle
man stty
Sie, wie Sie die aktuellen EinstellungenVersuche dies:
Ohne Zeilenumbrüche:
Mit Zeilenumbrüchen:
quelle
-d ''
ist genau das, was ich brauchte. Vielen DankWeitere Informationen zu Bash- Skripten finden Sie im ausgezeichneten Bash-Handbuch .
Insbesondere die Bash-FAQ enthält dies unter Nummer 1:
Wie kann ich eine Datei (Datenstrom, Variable) zeilenweise (und / oder feldweise) lesen?
quelle
read -r
, aber wie bekomme ich es dazu von STDIN? Ich habe versucht,read -r
früh zu verwenden.Ich habe dieses Problem gelöst, indem ich mich mit jeder Zeile befasst habe, bis ich eine leere Zeile gefunden habe. Es funktioniert gut genug für meine Situation. Wenn Sie jedoch eine bessere Lösung hinzufügen möchten, können Sie dies tun.
quelle
read -r
stattdessen.Sie können einen Editor wie vim, pico ... starten
quelle
Zuerst ein paar Korrekturen:
-e
, verwenden Sie readline (damit Sie den Bash-Verlauf und alle Bearbeitungsfunktionen haben).-d
Nimmt nur ein Zeichen. ZB 'END' nimmt 'E' und wenn der Benutzer ein 'E' schreibt, stoppt der Lesevorgang (ich denke, das ist nicht das, was Sie wollen ...)Hierfür gibt es einige Möglichkeiten. Ich würde Zeile für Zeile lesen und anhalten, wenn eine leere Zeile gefunden wird (obwohl Sie ein beliebiges Stoppwort setzen könnten):
quelle
Sie haben mehrere Methoden.
Eine der einfachsten Methoden ist:
Beispielsweise:
quelle
ls
!Wir verwenden ein Konstrukt mit xargs und ctrl-d zum Brechen. Ich bin nicht vollkommen zufrieden damit, aber es erledigt mit Sicherheit die Aufgabe, mehrzeilige Benutzereingaben zu übernehmen und diese in eine Variable einzufügen (Formatierung intakt). (Bei der ersten und dritten Zuweisung werden die Inhalte der xargs-Eingabe in Anführungszeichen gesetzt.)
Wir verwenden reminderBody als Betreff einer E-Mail, die per Post verschickt wird (via Bash).
quelle
Siehe: http://tldp.org/LDP/abs/html/internal.html#READR
Verwenden Sie
read
und beachten Sie, dass, wenn Sie eine Zeile mit\
dem Zeilenumbruch beenden, ignoriert wird. Sie könnten also Folgendes tun:quelle