2014-01-10 32 views
0

根據要打印的表,我的腳本將變量構造爲給定的順序。但是如果結束字符串中有空格,printf會將其視爲單獨的列。想象一下:使用空格擴展變量printf

one=1 
two="2 3" 
all="$one $two" 
format="%5s%5s" 
printf $format $all 

printf命令如何理解在$ all中正確傳遞的變量?我知道他們正在擴展,並且printf將它看作一個單獨的字符串,但是我找不到一種方法讓它在像$ 4這樣的變量中有空格的地方工作。

回答

2

它不能,如書面。您不能選擇性地將一些空格視爲單詞拆分,而將其他空間視爲不在參數展開中。但是,您可以使用數組來保留非分詞空間。

one=1 
two="2 3" 
all=("$one" "$two") 
format="%5s%5s" 
printf "$format" "${all[@]}" 
+0

謝謝。我忘了提到最終$ all是在for循環中構建的,即:all = $ all $ var所以有沒有辦法在循環之前將$ all定義爲數組? – delronhubbard

+0

'all =()'初始化,然後'all + =(「$ var」)'相當於'all = $ all $ var'。 – chepner

+0

有趣......在TPL(自定義應用程序語言)中,這些列表出於某種奇怪的原因,我以前沒有遇到過bash腳本,但是對我的用途來說是完美的。當我的系統決定返回時,我會給出這個運行。 – delronhubbard

1

您應該將這兩個值存儲在數組中而不是字符串中。

one=1 
two="2 3" 
all=("$one" "$two") # array with 2 elements 
format="%5s%5s" 
printf "$format" "${all[@]}" # quoting the array expansion properly passes two args