在破折號中列印帶有反斜杠的變數
我的外殼是破折號。我的問題如下:
# 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 提供了一個%q
dash 不提供的轉換):printf '%s\n' 'abc\ndef'
這會
abc\ndef
在兩個外殼中產生。您也可以使用 ; 的外部實現
echo
。在 Linux 上,coreutils
為您提供 GNU echo in/bin/echo
:/bin/echo 'abc\ndef'
但是請注意,這不太便攜。GNU 資訊文件有這樣的說法:
POSIX 不需要支持任何選項,並表示
echo
如果任何字元串包含反斜杠或第一個參數是-n
. 如果攜帶式程序printf
需要省略尾隨換行符或輸出控製字元或反斜杠,則可以使用該命令。
不,有很多變體
echo
。echo
不是攜帶式命令。
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