Bash 如何编写要由echo解释的ESC字符?

Bash 如何编写要由echo解释的ESC字符?,bash,Bash,是否有\ESC或我可以放置的东西,以便echo命令可以解释它 其中是这些命令的列表,如\t\n\r等?是的,您可能需要通过-e开关: echo -e '\n\t\a' 您可以在echo手册页和info条目中找到解释转义的列表。这是针对GNU coreutilsecho,可能是您正在使用的: If -e is in effect, the following sequences are recognized: \\ backslash \a alert (B

是否有\ESC或我可以放置的东西,以便
echo
命令可以解释它


其中是这些命令的列表,如
\t\n\r
等?

是的,您可能需要通过
-e
开关:

echo -e '\n\t\a'
您可以在
echo
手册页和
info
条目中找到解释转义的列表。这是针对GNU coreutils
echo
,可能是您正在使用的:

   If -e is in effect, the following sequences are recognized:

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \e     escape

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

   \0NNN  byte with octal value NNN (1 to 3 digits)

   \xHH   byte with hexadecimal value HH (1 to 2 digits)
Bash将用自己的内置代码替换
/bin/echo
,但上面的所有序列都会被解释

请注意,Posix合规性不需要此,因此一些shell将部分或不支持
-e
标志和转义,即Debian/Ubuntu Dash,这是这些平台上的默认shell。您必须以
/bin/echo
的形式调用
echo
,以避免调用内置代码,并确保您的
/bin/echo
可以处理转义


如果需要编写可移植代码,请使用
printf

是的,您可能需要通过
-e
开关:

echo -e '\n\t\a'
您可以在
echo
手册页和
info
条目中找到解释转义的列表。这是针对GNU coreutils
echo
,可能是您正在使用的:

   If -e is in effect, the following sequences are recognized:

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \e     escape

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

   \0NNN  byte with octal value NNN (1 to 3 digits)

   \xHH   byte with hexadecimal value HH (1 to 2 digits)
Bash将用自己的内置代码替换
/bin/echo
,但上面的所有序列都会被解释

请注意,Posix合规性不需要此,因此一些shell将部分或不支持
-e
标志和转义,即Debian/Ubuntu Dash,这是这些平台上的默认shell。您必须以
/bin/echo
的形式调用
echo
,以避免调用内置代码,并确保您的
/bin/echo
可以处理转义


如果您需要编写可移植代码,请使用
printf

如果您使用的是bash,那么最好使用shell的所谓。这使您可以构造一个字符串,并将其传递给
echo
命令,该命令将简单地打印该字符串

例如,要打印ASCII
ESC
字符:

echo $'\e'

如果你不想要尾随的换行符

(由于几个原因,“ANSI-C引用”一词有点用词不当。C标准目前由ISO而不是ANSI生产,bash功能支持
\e
\e
来表示转义字符,而
\cX
用于control-X,这些功能不在标准C中。十六进制转义的处理也有点不同。)


更好的是,您可以使用
printf
命令,该命令还支持
\e
作为
ESC
字符。
printf
echo
更便于携带。
echo
命令有许多不同的版本,在大多数shell中都是
/bin/echo
和内置命令。
 printf
也存在于多个版本中,但跨实现的行为更加一致。使用printf的代码更有可能移植到bash以外的shell(或较旧版本的bash)而不是依赖于bash的
echo
命令或GNU coreutils
echo
命令的任何更为神秘的功能的代码。

如果您使用的是bash,可能最好使用该shell的所谓功能。这允许您构造一个字符串,可以传递给
echo
命令,该命令将简单地打印它

例如,要打印ASCII
ESC
字符:

echo $'\e'

如果你不想要尾随的换行符

(由于几个原因,“ANSI-C引用”一词有点用词不当。C标准目前由ISO而不是ANSI生产,bash功能支持
\e
\e
来表示转义字符,而
\cX
用于control-X,这些功能不在标准C中。十六进制转义的处理也有点不同。)


更好的是,您可以使用
printf
命令,该命令还支持
\e
用于
ESC
字符
printf
echo
更便于携带。有许多不同版本的
echo
命令,在大多数shell中都是
/bin/echo
和内置命令
printf
也存在于多个版本中,但是跨实现的行为更加一致。使用printf的代码比依赖于bash的echo命令的任何更神秘功能的代码更容易移植到bash以外的shell(或bash的旧版本),或者GNU coreutils
echo
命令。

即使没有
-e
@EtanReisner,dash似乎也能处理转义字符,这是因为
\n
\t
(可能还有其他一些序列)直接在字符串中替换,
echo
本身不支持转义。请尝试
echo-e'\x01'
,您会发现该注释毫无意义。如果shell直接在字符串中执行,则不需要
-e
。如果shell没有执行此操作,则echo可能需要
-e
。你不能两全其美。另请参阅破折号中关于echo的部分。我检查得更好,并且,不管shell已经在双引号之间进行了检查,因为您是对的。但是注释是有意义的,请再次阅读:一些序列(即,
\n
\t
)被解释,而不是全部(事实上,您链接的手册页上说“所有其他反斜杠序列都会引发未定义的行为”)。但是,不支持
-e
开关。如果shell已经用双引号进行了扩展,那么echo就不需要这样做。当使用shell能够理解的转义字符时,您可以完全删除
-e
。你认为那是什么逃避?当然不是上面列表中的任何一个。即使没有
-e
@EtanReisner,dash似乎也能处理转义字符