Shell

在破折號中列印帶有反斜杠的變數

  • November 24, 2017

我的外殼是破折號。我的問題如下:

# A="abc\nde fg"
# printf "$A"
abc
de fg#

# B="abc\\nde fg"
# printf "$B"
abc
de fg#

# C="abc\\\nde fg"
# printf "$C"
abc\nde fg# 

我正在使用的字元串變數既有空格,\n也可能有其他空白字元。我想在$A不轉義\n字元串的情況下訪問變數。使用單引號不會將其解釋為變數,而使用雙引號會解釋這些特殊字元。

dash 是否有內置到外殼中的方法來執行此操作?我知道我可以將變數發送到一個外部程序,該程序將使字元串中的轉義字元的反斜杠加倍,但這感覺不對。

編輯:

我意識到我的錯誤,printf但在這種情況下它是無關的。最初我使用的是echo. 這是我要問的一個更好的例子。這是兩個完全相同的命令序列,只有第一個是 bash,第二個是破折號:

重擊

$ cat sample.txt
abc\nde fg

some string

$ A=`cat sample.txt`
$ echo "$A"
abc\nde fg

some string
$ 

短跑

$ cat sample.txt
abc\nde fg

some string

$ A=`cat sample.txt`
$ echo "$A"
abc
de fg

some string
$ 

我想知道我是否可以讓破折號不解釋\n這一系列命令中的。我已經使用外部命令實現了一種解決方法。的正確使用可以滿足我的printf要求,但我很想知道 dash shell 本身是否有某種方式可以做到這一點。

為了完整起見,這是出現問題的原因。我需要閱讀一個文件並有條件地註釋或取消註釋底部。第一部分有一個文字\n(不是換行符),需要在重寫的文件中保持這種狀態。

我使用包含在反引號中的 sed 將文件分成兩部分,並將它們分配給變數。最後,我通過簡單地執行類似的操作來連接變數"$VAR1$VAR2",其中$VAR2已經有條件地註釋、未註釋或不理會。

您的問題是 Bash 和 Dash 都具有echo內置功能,但是當給定包含以下內容的字元串時,這兩種實現的行為不同\

echo 'abc\ndef'

這會在兩個殼上產生不同的結果。


您可以使用printf '%s\n';獲得一致的輸出。雖然這也是一個內置的,但它在兩個 shell 上產生相同的輸出(並非所有轉換都如此,例如 bash 提供了一個%qdash 不提供的轉換):

printf '%s\n' 'abc\ndef'

這會abc\ndef在兩個外殼中產生。


您也可以使用 ; 的外部實現echo。在 Linux 上,coreutils為您提供 GNU echo in /bin/echo

/bin/echo 'abc\ndef'

但是請注意,這不太便攜。GNU 資訊文件有這樣的說法:

POSIX 不需要支持任何選項,並表示echo如果任何字元串包含反斜杠或第一個參數是-n. 如果攜帶式程序printf需要省略尾隨換行符或輸出控製字元或反斜杠,則可以使用該命令。

不,有很多變體echoecho不是攜帶式命令。

dash’secho實際上是為數不多echo的符合 UNIX 的實現之一(至少在這方面;dash不知道多字節,例如,在支持多字節語言環境的系統上,它不符合其他領域)。

UNIX 規範要求

echo '\n'

輸出兩個換行符和

echo -e x

輸出-e x<newline>

雖然其他一些 shell(如 AT&T ksh、或bash)具有改變其內置行為的設置(GNU命令的行為也可能受環境影響),但目前並非如此。yash``zsh``echo``echo``dash

在任何情況下,您都不想使用它echo來輸出任意數據。標準和可移植的命令是printf.

您可以在為什麼 printf 比 echo 更好的答案中找到更多詳細資訊,包括如何實現不同echo的包裝函式。printf

引用自:https://unix.stackexchange.com/questions/329259