[英]echo newline character output
我正在編寫bash腳本,並且在編寫該行時:
echo "l=l.split('\n')"
我希望輸出實際上是l=l.split('\\n')
但得到:
l=l.split(' ')
關於如何解決此問題的任何想法? 我嘗試在不同位置使用引號,並以不同的方式轉義字符,但似乎沒有任何效果。 感謝幫助!
**值得一提-如果我只是在終端中鍵入echo命令,我將得到所需的輸出。。不確定為什么要對腳本進行不同的處理。
聽起來好像您把shebang弄錯了(無論如何,對於bash
腳本)。 舉個例子:
$ cat test.sh
#!/bin/sh
echo "l=l.split('\n')"
$ ./test.sh
l=l.split('
')
$ cat test.bash
#!/bin/bash
echo "l=l.split('\n')"
$ ./test.bash
l=l.split('\n')
即使在某些系統上bash
和sh
可以由同一shell提供,它們的行為也存在細微的差異。 如果您希望它的行為像在終端機中一樣,請確保使用#!/bin/bash
。
TL;博士
如果您的腳本實際上是由bash
運行的 ,則必須打開默認關閉的xpg_echo
shell選項-直接或通過shell選項posix
xpg_echo
。
當Bash作為sh
( /bin/sh
)調用時, posix
是隱式打開的,例如在macOS上。
如果您的腳本不是由bash
運行 ,這是最可能的解釋,如FatalError的有用答案中所建議:
確保腳本的shebang行是
#!/bin/bash
或#!/usr/bin/env bash
。
或者,將其直接傳遞給bash
: bash <script>
可移植的解決方案可以使您免受可變的echo
行為的影響,它可以按以下方式使用printf
:
printf '%s\\n' "l=l.split('\\n')"
在bash
,默認情況下將關閉echo
對轉義序列(例如\\n
的解釋。
必須打開選項xpg_echo
才能使echo
識別轉義序列 。
如果以POSIX兼容模式運行bash
(使用shopt -o posix
驗證), 則該選項隱式啟用,如果 以sh
身份運行Bash ,例如在macOS上 ,例如/bin/sh
是Bash,則也會發生這種情況。
請注意,無論xpg_echo
本身是什么狀態, 都可以使用echo -e
臨時選擇轉義序列解釋,並使用echo -E
選擇退出 。
然而, 在POSIX兼容模式(運行時,這不起作用 shopt -o posix
符合POSIX - - ),其中echo
支持沒有任何選項 。
換句話說:僅當(a) bash
確實在執行您的腳本並且(b) posix
選項為off時,以下內容才有效 :
echo -E "l=l.split('\n')"
同樣, printf
是可移植的 ,與POSIX兼容的替代方案 , 可在所有與POSIX兼容的shell中一致地工作,而與shell選項的狀態無關 :
# '%s\n': *without* escape-sequence interpretation
$ printf '%s\n' "l=l.split('\n')"
l=l.split('\n')
# '%b\n': *with* escape-sequence interpretation
$ printf '%b\n' "l=l.split('\n')"
l=l.split('
')
這樣就解決了問題。
echo "l=l.split('\\\n')"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.