2010-12-14 42 views
23

我已經閱讀了關於echo的手冊頁,它告訴我-e參數將允許轉義字符,例如換行符的轉義字符n具有其特殊含義。當我鍵入命令echo輸出bash腳本中的-e參數。我怎樣才能防止這一點?

$ echo -e 'foo\nbar' 

到交互式bash shell中,我得到的預期輸出:

foo 
bar 

但是當我使用這個相同的命令(我試過此命令字符的字符作爲測試用例)我得到以下的輸出:

-e foo 
bar 

就好像回聲訓釋的-e作爲參數(因爲新行仍顯示),但它也解釋-e作爲字符串歐共體豪。這裏發生了什麼?我怎樣才能防止-e出現?

+0

我的情況下,運行Ubuntu 10.04清醒這一點很重要 – 2010-12-14 04:30:52

+0

您使用的呼應?在命令行上鍵入'回顯'。 – 2010-12-14 04:33:48

+0

事實證明,我在我的腳本中使用'Bourne Shell'版本,但在交互版本中使用Bash版本。 – 2010-12-14 09:49:40

回答

28

您需要使用#!/bin/bash作爲腳本的第一行。如果您沒有,或者如果您使用#!/bin/sh,腳本將由Bourne shell運行,而其echo不能識別-e選項。一般來說,如果可移植性很重要,建議所有新腳本使用printf而不是echo

在Ubuntu中,sh是通過符號鏈接提供給/bin/dash

+0

噢就是這樣。我有!#/ bin/sh,這顯然是在Bourne中運行的,但我的交互式shell是Bash。乾杯。 – 2010-12-14 09:35:47

+0

+1。甚至在7個月後從一定的醜陋中保存我的日誌 – Vlueboy 2011-07-06 22:24:00

+0

如何解決python中的相同問題?我想打印os.system(「echo -e'\ x41'」)但它有同樣的問題 – 2017-03-13 00:01:11

3

echo的不同實現以令人煩惱的方式表現出來。有些不採取選擇(即,只會按照您的描述回顯-e),並自動解釋參數中的轉義序列。有些人拿旗子,除非給予-e國旗,否則不解釋逃跑。一些取得標誌,並根據-e標誌是否通過解釋不同的轉義序列。如果你試圖讓他們以可預見的方式行事,那麼有些人會讓你把頭髮撕掉......哦,等等,這些都是。

什麼,你可能看到的是該版本的echo建成bash VS /bin/echo或可能與其他一些shell的內建之間的差異。這在我Mac OS X v10.5發貨時帶有一個bash內置的echo回顯標誌,與我所有的腳本預期不同...

在任何情況下,都有一個解決方案:使用printf代替。它總是在第一個參數(格式字符串)中解釋轉義序列。問題是它不會自動添加一個換行符(所以你必須記住這麼做),它還在第一個參數(它畢竟是一個格式字符串)中解釋了%序列。一般來說,您想要將所有格式化的東西放在格式字符串中,然後在其餘參數中放入可變字符串,以便您可以控制它們如何解釋用於將它們插入到輸出中的格式。一些例子:

printf "foo\nbar\n"  # this does what you're trying to do in the example 
printf "%s\n" "$var"  # behaves like 'echo "$var"', except escapes will never be interpreted 
printf "%b\n" "$var"  # behaves like 'echo "$var"', except escapes will always be interpreted 
printf "%b\n" "foo\nbar" # also does your example 
+0

太好了,謝謝你的細節。我非常喜歡C中的printf,所以它應該是一個快照。 – 2010-12-14 09:33:15

1

使用

別名呼應的/ usr /斌/回聲

給力 '回聲' 援引的coreutils'迴音解釋 '-e' 參數。

相關問題