簡體   English   中英

回聲換行符輸出

[英]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')

即使在某些系統上bashsh可以由同一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

    • 或者,將其直接傳遞給bashbash <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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM