2017-09-07 55 views
1

在執行腳本時,我遇到了以下問題:將命令的多行結果放入變量時,看起來多行字符串的最後一行(空行)消失。因爲我將保存在數據庫中的代碼塊和包含「\ n」字符的代碼塊連接在一個可讀的字符串中,因此我不能丟失它包含的回車符。如果我失去了一些「\ N」的,我會失去我的代碼縮進的一部分),爲什麼我的多行字符串的最後一行(空行)在將其保存在變量中時會消失?

這裏是代碼來說明我的問題:

test="A 

B 
"; 
test2=`echo "$test"`; 
echo "||$test2||"; 

這將返回

||A 

B|| 

w ^往往微不足道我期待:

||A 

B 
|| 

- >最後一個(空)線已經消失......並回車在我的人類可讀的代碼從而錯過。只有當我的多線串的最後一行是空的發生

這個問題......

你知道

  • 爲什麼最後一行消失?
  • 我如何確保我最後的空行保存在我的多行字符串變量中?

注意,我當然不能用最簡單的解決

test2="$test"; 

因爲整個過程相當:

test="^A\n\nB\n^" 
test2="`echo "$test" | sed -e 's/\^//g'`"; 

,但我試圖簡化問題,最讓我可以。

+0

命令替換總是修剪後的新行 - - 這符合設計和規範。否則,'foo = $(echo foo)'不會包含字符串'foo',但會有一個尾隨的換行符 - 這會混淆人們。 –

+0

順便說一句,哪個特定版本的ksh是這個?有很多不同的,不兼容的實現浮動。 –

+0

@CharlesDuffy無法找到我正在使用的ksh版本的命令...我試過「ksh --version」,「echo $ {。sh.version}」&「echo $ KSH_VERSION」。如果你知道識別我的ksh版本的其他可能性,我非常感興趣;-) – Seba991

回答

2

命令替換總是修剪後的新行 - 這是按照設計和規格。如果你不希望出現這種情況,可以追加一個固定的印記字符到您的輸出,並修剪它,這樣你希望保留換行符之前的印記:

test="A 

B 
" 
test_wip=$(printf '%sEND' "$test") 
test2=${test_wip%END} 
+0

的確,有了這個想法,我可以得到我想要的結果 test_wip = $(printf'%sENDOFLINE'「$ test」); test_wip2 =「'echo」$ test_wip「| sed -e's/\^// g''」; test2 = $ {test_wip2%ENDOFLINE}; 讓我們希望沒有人會在我試圖解釋的代碼中使用「ENDOFLINE」。 – Seba991

+0

@ Seba991:你可以使用'test2 =「$(echo」$ {test}「)來縮短一點,ENDOFLINE | sed -e's/\^// g')」'; 'test2 =「$ {test2%ENDOFLINE}」' – markp

+0

@ Seba991,好吧,我們只是刪除一個'ENDOFLINE'(最後一個),所以沒關係,如果*是*額外的數據中的字面意思。 –

0

,而不是試圖解決的是從echo輸出分配給一個變量出現的問題(例如,去除尾隨\ n的),可以考慮使用內置的字符串處理ksh的在這種情況下,如:

$ test="^A\n\nB\n^" 
$ test2="${test//^}" 
$ echo "||${test2}||" 
||A 

B 
|| 
  • //^:刪除所有^字符
+0

當我嘗試,我得到錯誤: KSH:TEST2 =「$ {測試//^}「:0403-011指定的替換對此命令無效。 – Seba991

+0

嗯,'ksh --version'返回什麼? – markp

+0

@ Seba991,該命令替換在ksh 93u +中有效;如果您使用的是舊版本(或者不兼容的第三方克隆,例如mksh),則應在問題中指定該版本。 –

相關問題