Bash

如何在沒有“-e”選項或中間變數的情況下“回顯”彩色消息?

  • May 3, 2019

在處理ANSI 轉義碼以列印彩色消息時,我真的很難理解echo(以及其他此類命令)的行為。

我知道我可以使用這樣的-e選項:

echo -e "\e[32m FOO \e[0m"

我的消息將成功著色。

另外,我注意到我可以將輸出分配echo -e給一個變數,然後在沒有****選項echo的新命令中重新使用這個變數,這無論如何都會起作用。-e

foo=$(echo -e "\e[32m FOO \e[0m")
echo $foo

那麼,echo -e遇到 ANSI 程式碼時發出的實際“原始字節”是什麼?我的foo變數包含什麼?我怎樣才能將它們直接集成到我的echo "??? FOO ???"而不需要-e選項?

您初始的“原始輸出”echo將包含實際的轉義字元(ASCII 程式碼 27,八進制 033)而不是\e. 字元串的其餘部分保持原樣。它是用轉義字元替換字元序列的選項(-e就像它會用製表符等替換一樣)echo``bash``\e``\t

要將轉義字元直接合併到$foo不通過echo -e,您必須在字元串中鍵入實際的文字轉義字元。

bash中,您可以通過按Ctrl+V後跟來鍵入文字轉義字元Esc

在終端中,這看起來像

foo="^[[32mFOO^[[0m"

其中每個^[生成Ctrl+V後跟Esc.

或者,您可以使用$'...'(“C string interpolation” in bash) 來展開\e

foo=$'\e[32mFOO\e[0m'

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