2010-11-28 17 views
31
read -p "Please Enter a Message:" message 

Wie kann ich einen Zeilenumbruch nach Message: hinzufügen?Wie füge ich einen Zeilenumbruch für den Lesebefehl hinzu?

+0

Sie könnten in Betracht ziehen, die akzeptierte Antwort auf [diese] (http://stackoverflow.com/a/15696250/1048539) zu aktualisieren, da es weit weniger hacky (und weniger verwirrend für zukünftige Besucher ...) ist. – enderland

Antwort

28

ich mag Huang F. Lei's answer, aber wenn man den wörtlichen Zeilenumbruch nicht mögen, das funktioniert:

read -p "Please Enter a Message: `echo $'\n> '`" message 

Shows:

Please Enter a Message: 
> _

... wo _ ist, wo der Cursor nach oben endet. Beachten Sie, dass nachfolgende Zeilenumbrüche in der Regel während der Befehlsersetzung gelöscht werden. Ich habe danach die > eingefügt. Aber eigentlich Ihre ursprüngliche Frage scheint nicht, dass die schnelle Bit zu wollen, so:

# Get a carriage return into `cr` -- there *has* to be a better way to do this 
cr=`echo $'\n.'` 
cr=${cr%.} 

# Use it 
read -p "Please Enter a Message: $cr" message 

Zeigt

Please Enter a Message: 
_

Es muss ein besserer Weg sein, aber.

+0

Ich hoffe es gibt einen besseren Weg :) – Strawberry

+0

@Doug: Yeah. Nur mit einer * leichten * Verbesserung aktualisiert. Ich bin immer noch nicht glücklich damit. :-) –

+0

@Doug: Obwohl ich jetzt darüber nachdenke, da 'echo' (wie' read') ein bash eingebaut ist, obwohl das oben genannte ein bisschen peinlich ist, es zumindest nicht unnötig Prozesse hervorbringt. –

2

Vom bash manpage:

-p prompt 
    Display prompt on standard error, without a trailing new- 
    line, before attempting to read any input. The prompt is 
    displayed only if input is coming from a terminal. 

also nicht mit read selbst und setzen \n in dem Meldungs-String-Echo nur \n. Die Antwort sollte jedoch einfach sein - nicht bekommen read die Eingabeaufforderung angezeigt werden.

echo "Please Enter a Message:" 1>&2 
read message 
+0

Aber das 'Echo' wird passieren, ob die Eingabe von einem Terminal kommt oder nicht; Die Meldung 'read' wird nicht angezeigt. –

+0

Messepunkt, _wenn das Skript nicht interaktiv verwendet wird. – Alnitak

+1

Auch würde ich Echo auf Fehlerstrom umleiten müssen. – Strawberry

9
$ read -p "Please Enter a Message: 
> " message 
Please Enter a Message: 

Eingabe einen "Newline" zwischen ':' und '"' direkt

+1

saubere Lösung, aber könnte jemanden verwirrt den Code später lesen. – Alnitak

+1

Es funktioniert, aber es ist wirklich ein Ghetto-Fix. +1 unabhängig. – Strawberry

+1

Es ist, was für mich funktioniert, weil ich auch eine Variable habe, und mit der 'read -p $ (echo -e 'Bitte geben Sie eine Nachricht: \ n \ b')" Nachricht "Lösung, druckt es den Variablennamen wörtlich . Diese Lösung wird ordnungsgemäß erweitert. – aliteralmind

-2

read -p "Please Enter a Message:Return" message

+0

Funktioniert nicht für mich mit bash auf Ubuntu 10.04. Bist du dir deiner Syntax sicher? –

+0

Vielleicht wollen Sie den Return-Key als die Huang F. Lei-Lösung schlagen? –

+0

@LucaBorrione: ja –

5

einfach zu verbessern, um die Antworten von Huang F. Lei und von T.J. Crowder, die ich mag (und +1 hinzugefügt) .. Sie eine der folgenden Syntaxen verwenden, die im Grunde die gleichen sind, es auf Ihrem Geschmack abhängt (I bevorzugen die erste):

read -p "$(echo -e 'Please Enter a Message: \n\b')" message 
read -p "`echo -e 'Please Enter a Message: \n\b'`" message 

die beide die folgende Ausgabe erzeugen wird:

Please Enter a Message: 
_ 

wobei _ der Cursor befindet.
Falls Sie eine neue Zeile in jedem Teil der Zeichenfolge benötigen, aber am Ende, können Sie \n zum Beispiel

read -p "`echo -e '\nPlease Enter\na Message: '`" message 

werden

. 
Please Enter 
a Message: _ 

wo produzieren verwenden. ist eine leere erste neue Zeile und _ ist der Cursor.

Nur ein abschließendes Newline Sie \n\b wie in meinem ersten Beispiel

41

Einfach mal die genau die gleiche Sache verwenden, um hinzuzufügen.Sie können:

# -r and -e options are unrelated to the answer. 
read -rep $'Please Enter a Message:\n' message 

Und es funktioniert genau so, wie gefragt:

Please enter a Message: 
_ 

Hier ist ein Auszug aus dem manpage bash es zu erklären:

Wörter von der Form $ 'string "werden besonders behandelt. Das Wort wird auf string erweitert, wobei Zeichen mit umgekehrten Schrägstrichen wie im ANSI C-Standard angegeben ersetzt werden. Backslash Escape-Sequenzen, falls vorhanden, werden dekodiert wie folgt:

  • (...)
  • \ n neue Zeile
  • (...)

Das expandierte Ergebnis ist einzigen -Qoted, als ob das Dollarzeichen nicht vorhanden gewesen wäre.

Ich brauchte eine Weile, um es herauszufinden.

Beachten Sie, dass einfache Anführungszeichen und doppelte Anführungszeichen verhalten sich anders in dieser Hinsicht:

Eine Strings in doppelten Anführungszeichen ein Dollarzeichen ($) voran bewirkt, dass die Zeichenfolge entsprechend der aktuellen locale übersetzt werden. Wenn das Gebietsschema C oder POSIX ist, wird das Dollarzeichen ignoriert. Wenn die Zeichenfolge übersetzt und ersetzt wird, wird die Ersetzung doppelt zitiert.

+0

@ t-j-crowder Dies ist ein besserer Weg, der eine [T.J. Crowder] (http://stackoverflow.com/users/157247/t-j-crowder) wies auf :) – dmitri

+0

Ich mag das. Danke für die Verbesserung meines Wissens –

+0

Was macht '-e' genau? es funktioniert mit mir ohne dass '-e',' -e' nur für mich bewirkt, dass '-s' nicht mehr funktioniert. –

1

Hier ist eine Verbesserung der akzeptierte Antwort, die benötigt keine Subshell Laichen:

read -p "Please Enter a Message:"$'\n' message 

Vom GNU Bash reference manual:

Wörter der Form $'string' speziell behandelt werden. Das Wort wird auf Zeichenfolge erweitert, wobei Zeichen mit Backslash-Escapezeichen wie im ANSI C-Standard angegeben ersetzt werden.

Verwandte Themen