2016-08-04 76 views
7

我有一個很長的字符串可以通過echo命令打印。通過這樣做,我希望它完美縮進。 我想這和它是完全工作正常如何在回聲時避免空格被分割成多行

echo "This is a very long string. An"\ 
"d it is printed in one line" 

Output: 
This is a very long string. And it is printed in one line 

但是,當我嘗試正確縮進它作爲echo語句也縮進。它增加了額外的空間。

echo "This is a very long string. An"\ 
    "d it is printed in one line" 

Output: 
This is a very long string. An d it is printed in one line 

我找不到任何可以完美實現這一點的工作響應。

回答

5

這裏的問題是,你是給兩個參數echo,它的默認行爲是將它們打印背部採用了空間之間:

$ echo "a"    "b" 
a b 
$ echo "a" "b" 
a b 
$ echo "a"\ 
>   "b" 
a b 

如果你想在有完全控制權你要打印,使用陣列,printf

lines=("This is a very long string. An" 
     "d it is printed in one line") 
printf "%s" "${lines[@]}" 
printf "\n" 

這將返回:

This is a very long string. And it is printed in one line 

或者爲suggested by 123 in comments,使用echo還與陣列IFS設置爲null:

# we define the same array $lines as above 

$ IFS="" 
$ echo "${lines[*]}" 
This is a very long string. And it is printed in one line 
$ unset IFS 
$ echo "${lines[*]}" 
This is a very long string. An d it is printed in one line 
#       ^
#        note the space 

Bash manual → 3.4.2. Special Parameters

*

($ )擴展到位置參數,從一開始。當擴展不在雙引號內時,每個位置參數擴展爲單獨的單詞。在執行的上下文中,這些單詞受到進一步的單詞分割和路徑名擴展。當擴展出現在雙引號內時,它將擴展爲一個單詞,每個參數的值由IFS特殊變量的第一個字符分隔。也就是說,「$」相當於「$ 1c $ 2c ...」,其中c是IFS變量值的第一個字符。 如果IFS未設置,則參數由空格分隔。如果IFS爲空,則參數在沒有介入分隔符的情況下連接。

有趣的閱讀:Why is printf better than echo?

+0

謝謝。我正在那樣做。只是爲了記錄,是否有可能使用'echo'? – molecule

+1

@molecule你可以在'$ {lines [@]}「中爲'line'做一些事情。做; echo -n「$ line」; done'。但它有點難看,不是嗎? – fedorqui

+0

是的,的確很醜。謝謝隊友 – molecule