如何在bash中回显文字字符串“ -e”(以及其他内容)?

时间:2019-01-09 01:37:41

标签: bash escaping

我怎么echo文字字符串-e别无其他?

我试图更好地理解如何对shell参数进行转义。

以下命令不起作用:

echo -e # prints nothing
echo '-e' # prints nothing
echo "-e" # prints nothing
echo \-e # prints nothing
echo \\-e # prints \-e
echo '\-e' # prints \-e
echo "'-e'" # prints '-e' (with quotes)
echo -- -e # prints -- -e

我找不到一个既不包含引号也不包含斜杠的内容。

4 个答案:

答案 0 :(得分:5)

  

如何在bash中回显文字字符串“ -e”(以及其他内容)?

printf '%s\n' '-e'
printf -- '-e\n'

来自man echo -e的一个选项:

  

-e
  启用反斜杠转义的解释

来自bash builtins

  

回声   ...
  如果指定-e选项,则启用对以下反斜杠转义字符的解释。
  ...
  echo不能解释-意味着选项的结束。

因此echo -e将使回声将-e解释为一个标志并打印空换行符。 要打印-e,您基本上必须使用printf(或者您可以使用echo的实现方式)。我不相信只能使用内置的bash echo打印-e

printf具有更高的可移植性。 echo的某些实现不带-e参数,并且可能有效。在网上,您可以找到various sites关于回声可移植性问题。

答案 1 :(得分:3)

 echo -e '\x2de'

不是很可读,但是可以用

答案 2 :(得分:2)

我假设真正的问题是为什么:

根据您是以foo(4)还是foo(2+2)foo((int)16/4)调用C#或Java函数,其行为永远不会有所不同,因为该信息在函数运行时就消失了。它可以告诉您通过了什么,但无法告诉您如何通过

出于相同的原因,根据是否或如何转义其参数,命令的行为永远不会有所不同。引号和转义符是 how ,而结果字符串参数是 what

以下是每次尝试的等效execlp调用(echo内置在bash中,但行为相同):

#    v-- How you passed it            v-- What you passed
echo -e     # execlp("echo", "echo", "-e", 0);   # prints nothing
echo '-e'   # execlp("echo", "echo", "-e", 0);   # prints nothing
echo "-e"   # execlp("echo", "echo", "-e", 0);   # prints nothing
echo \-e    # execlp("echo", "echo", "-e", 0);   # prints nothing
echo \\-e   # execlp("echo", "echo", "\\-e", 0); # prints \-e
echo '\-e'  # execlp("echo", "echo", "\\-e", 0); # prints \-e
echo "'-e'" # execlp("echo", "echo", "'-e'", 0); # prints '-e' (with quotes)
echo -- -e  # execlp("echo", "echo", "--", "-e", 0);   # prints -- -e

如您所见,如何完全不影响输出。这一切都归结为什么。这就是为什么世界上所有逃避都不会产生预期效果的原因。

答案 3 :(得分:0)

另一种方法,使用awk和Bash C样式字符串以及'here字符串':

$ awk '1' <<< $'-e' 
-e

不带引号的作品(如果这是您的目标):

$ awk '1' <<< -e
-e