如何在命令行中输出"-e"?

7
我希望能够输出一个字符串,其中可能包含与echo相同的参数。我该如何在不修改字符串的情况下实现?
例如:
$ var="-e something"
$ echo $var
something

...没有打印出 -e

6个回答

9
一个令人惊讶的深奥问题。由于您标记了,我会假设您指的是bash的内部echo命令,尽管GNU coreutils的独立echo命令可能工作方式相似。 要点是:如果您确实需要使用echo(这可能令人惊讶,但现在问题就是这样写的),那么一切都取决于您的字符串可以包含什么。
简单情况:-e加非空字符串
在这种情况下,在将变量传递给echo之前,只需对其进行引用即可。
$ var="-e something"
$ echo "$var"
-e something

如果字符串不恰好是 echo 选项或组合,包括任何非选项后缀,则 echo 将无法识别它,并将其打印出来。
更难的情况是字符串只能是 -e。解决这个问题的方法之一是:
$ echo -e '\055e'
-e

(转义破折号,以便它被解释为八进制序列而不是选项)

这是重写字符串。它可以自动且非破坏性地完成,所以感觉可接受:

$ var="-e something"
$ echo -e ${var/#-/\\055}
-e something

你可能已经注意到我实际上使用了-e选项来解释一个八进制序列,所以如果你打算使用echo -E,它将无法正常工作。但是对于其他选项,它可以正常工作。

正确的方法

说真的,你不必局限于使用echo,对吧?
printf '%s\n' "$var"

非常感谢您提供如此详细的答案!我有一个问题:您提到的两个版本的echo有什么区别?我现在使用的是Ubuntu系统,如何启动它们? - Ricky Robinson
1
如果你在bash下,普通的echo将会得到shell内置的版本,而/usr/bin/echo将会得到独立的版本。(还有其他方法)你可以使用--version来区分它们。 - JB.
这个答案忽略了即使是bash内置的echo实现也不能保证始终一致的行为。将其行为与shopt -s xpg_echo; set -o posix开启和关闭时进行比较(请注意,前者在shell处于POSIX模式以外时,使bash的echo符合POSIX标准,可以作为编译时标志默认启用)。 - Charles Duffy
当然了。坦率地说,这个问题并不值得回答。 - JB.

3

请引用它:

$ var="-e something"
$ echo "$var"
-e something

如果您想要获得echo -e的行为(启用反斜杠转义的解释),则必须将$var引用保留没有引号:
$ var="hi\nho"
$ echo $var
hi
ho

或者使用 eval

$ var="hi\nho"
$ eval echo \${var}
hi\nho

$ var="-e hi\nho"
$ eval echo \${var}
hi
ho

我很好奇你会如何使用eval来仅回显“-e”。 - JB.
@JB。我也是这样,一直在进行少量的测试。刚刚更新以展示它 :) - fedorqui
我的问题是:你能让echo仅打印字符串“-e”和“-e”吗? - JB.
JB:如果变量包含“-e something”(或者你为什么想要这样),为什么会打印出“-e”?你的问题没有意义(但我肯定我误解了你;-))。 - Adrian Frühwirth
@AdrianFrühwirth 想象一下变量仅包含“-e”,如果这对您更有意义的话。至于为什么会想要这样做,一切都不确定。 - JB.
显示剩余3条评论

3
正确的bash方法是使用printf
printf "%s\n" "$var"

顺便提一下,你的 echo 没起作用是因为当你运行时:
var="-e something"
echo $var

如果不引用$varecho将看到两个参数:-esomething。因为当echo遇到-e作为第一个参数时,它会认为这是一个选项(对于-n-E也是如此),并进行处理。如果像其他答案中所示那样引用了var,它就可以正常工作。


2

由于我们正在使用 bash,除了使用 echo 之外,另一种选择是简单地使用 cat 和一个“here string”

$ var="-e something"
$ cat <<< "$var"
-e something
$ var="-e"
$ cat <<< "$var"
-e
$ 
< p > 基于 printf 的解决方案几乎肯定更具可移植性。 < /p >

2
请尝试以下操作:
$ env POSIXLY_CORRECT=1 echo -e
-e

由于 shell 别名和内置的 echo 命令,使用未加修饰的 echo 在交互式或脚本中可能会得到与此处描述不同的功能。通过 env 调用它(即 env echo ...)可避免来自 shell 的干扰。

环境变量 POSIXLY_CORRECT 用于强制执行符合标准的行为。请参见:维基百科上的 POSIX

或者使用 printf

$ printf '%s\n' "$var"

来源:Bash 数组开头的 -e 是什么意思?(stackoverflow SE)

1
更好的写法是:env POSIXLY_CORRECT=1 echo -e。这不使用内置命令,而是外部命令。由于它很可能在 /bin/echo 中,因此您可以直接调用它:POSIXLY_CORRECT=1 /bin/echo -e。但是,您的 printf 解决方案当然是最好和最便携的。 - gniourf_gniourf

1
使用printf替代:
var="-e bla"
printf "%s\n" "$var"

如果 var 只包含一个 -e 或类似字符,仅使用 echo "$var" 仍然会失败。如果您需要能够打印出来,请使用 printf


bashecho 命令并不会特别处理 --,它只是将其打印出来。 - chepner
我提出另一个版本,因为我认为能够单独打印“-e”可能很重要(这在使用“echo”时根本行不通)。 - Alfe
是的,我也打算发布一个基于printf的答案。我认为这是最好的解决方案。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接