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

如何在Message:之後添加換行符?如何爲讀取命令添加換行符?

+0

你可能會考慮更新接受的答案爲[這一個](http://stackoverflow.com/a/15696250/1048539),因爲它遠遠小於哈克(少混亂對我們未來的參觀者......)。 – enderland 2016-02-12 16:21:03

回答

28

我喜歡Huang F. Lei's answer,但如果你不喜歡的文字換行,這個工程:

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

表演:

Please Enter a Message: 
> _

...其中_就是光標結束。請注意,由於尾隨的換行符通常在命令替換期間被刪除,因此我後面包含了>。但實際上,你原來的問題似乎並不希望出現這種情況提示一下,所以:

# 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 

顯示

Please Enter a Message: 
_

必須有一個更好的辦法,但。

2

bash手冊頁:

-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. 

所以,不能與read本身,並把\n消息字符串在短短呼應\n。答案應該是簡單的,但 - 沒有得到read顯示提示:

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

但是,無論輸入是否來自終端,都會發生`echo'; 「read」消息不會顯示。 – 2010-11-28 09:20:22

+0

公平點,如果腳本將被非交互式使用。 – Alnitak 2010-11-28 09:22:02

+1

另外,我將不得不將回聲重定向到錯誤流。 – Strawberry 2010-11-28 09:32:13

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

鍵入之間的「換行」「:」和「「」直接

+1

整潔的解決方案,但可能會讓稍後讀取代碼的人感到困惑。 – Alnitak 2010-11-28 09:19:59

-2

read -p "Please Enter a Message:返回" message

5

只是爲了提高Huang F. LeiT.J. Crowder,我喜歡(並添加+1)的答案.. 您可以使用以下語法之一太多,基本上是相同的,這取決於你的口味(我喜歡第一個):

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

其中兩個將產生以下輸出:

Please Enter a Message: 
_ 

其中_是光標。
如果你需要的字符串,但最終的任何部分換行,你可以使用\n,例如

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

會產生

. 
Please Enter 
a Message: _ 

哪裏。是空白的第一個新行,_是光標。

只有添加你必須使用\n\b作爲我的第一個例子

41

只是爲了尋找同樣的事情最後結尾的新行。您可以使用:

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

它將工作完全是問:

Please enter a Message: 
_ 

這裏是bash的手冊頁解釋它的提取物:形式$的

詞'串'被特別對待。字擴展爲 字符串,反斜槓轉義字符被替換爲 ANSI C標準中指定的字符。反斜槓轉義序列,如果存在的話,被解碼 如下:

  • (...)
  • \ n個新線
  • (...)

膨脹的結果是單引用,好像美元符號不存在 一直存在。

花了我一會兒才知道。

注意單引號和雙引號不同的表現在這方面:

一個美元符號($)開頭的雙引用字符串將導致 字符串根據當前區域進行翻譯。如果cur- 租用區域設置爲C或POSIX,則忽略美元符號。如果翻譯並替換字符串 ,則替換爲雙引號。

1

這裏有公認的答案的改善,不需要產卵子shell:

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

GNU Bash reference manual

形式$'string'的詞會被特殊對待。字擴展爲字符串,反斜槓轉義字符被替換爲ANSI C標準指定的字符。

相關問題