String 我该如何回应-e";?

String 我该如何回应-e";?,string,bash,echo,String,Bash,Echo,我想要echo一个字符串,该字符串可能包含与echo相同的参数。如何在不修改字符串的情况下执行此操作 例如: $ var="-e something" $ echo $var something 。。。没有打印-e引用它: $ var="-e something" $ echo "$var" -e something 如果您希望获得echo-e的行为(启用反斜杠转义的解释),则必须将$var引用保留为不带引号: $ var="hi\nho" $ echo $var hi ho 或使用eva

我想要
echo
一个字符串,该字符串可能包含与
echo
相同的参数。如何在不修改字符串的情况下执行此操作

例如:

$ var="-e something"
$ echo $var
something
。。。没有打印
-e

引用它:

$ 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

一个令人惊讶的深奥问题。既然您标记了,我假设您指的是
bash
的内部
echo
命令,尽管GNU coreutils的standalone
echo
命令可能工作得很类似

要点是:如果您真的需要使用
echo
(这会让人惊讶,但这就是问题的编写方式),这完全取决于您的字符串可以包含什么内容

简单的情况是:
-e
加上非空字符串 在这种情况下,您只需在将变量传递到
echo
之前引用它

$ var="-e something"
$ echo "$var"
-e something
如果字符串不是一个包含任何非选项后缀的
echo
选项或组合,则
echo
将无法识别该字符串并将其打印出来

更难:字符串只能是
-e
如果您的案例可以简化为“-e”,则会变得更加棘手。一种方法是:

$ echo -e '\055e'
-e
(对破折号进行转义,使其不会被解释为选项,而是被解释为八进制序列)

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

$ var="-e something"
$ echo -e ${var/#-/\\055}
-e something
您注意到我实际上使用了
-e
选项来解释八进制序列,因此如果您打算
echo-e
,它将不起作用。不过,它也适用于其他选择

正确的方法 说真的,你不局限于回声,是吗

printf '%s\n' "$var"

改用
printf

var="-e bla"
printf "%s\n" "$var"

如果
var
仅包含
-e
或类似内容,则仅使用
echo“$var”
仍将失败。如果您还需要能够打印,请使用
printf

正确的bash方法是使用
printf

printf "%s\n" "$var"
$ printf '%s\n' "$var"
顺便说一下,您的
echo
不起作用,因为运行时:

var="-e something"
echo $var

(不引用
$var
),
echo
将看到两个参数:
-e
something
。因为当
echo
遇到
-e
作为其第一个参数时,它会将其视为一个选项(对于
-n
-e
,也是如此),因此会对其进行处理。如果您引用了
var
,如其他答案所示,它会起作用。

因为我们使用的是bash,
echo
的另一个替代方法是简单地
cat
a:

$var=“-e某物”
$cat请尝试以下操作:

$ env POSIXLY_CORRECT=1 echo -e
-e
由于shell别名和内置的
echo
命令,使用未经修饰的
echo
以交互方式或在脚本中可以获得不同的功能 比这里描述的要多。通过
env
调用它(即
env echo…
) 以避免来自外壳的干扰

引入了环境变量
POSIXLY_CORRECT
,允许用户强制执行符合标准的行为。参见:维基百科

或者使用
printf

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

来源:在stackoverflow SE

bash
echo没有专门处理
--
;它也可以打印。我建议另一个版本,因为我认为单独打印
-e
可能很重要(这对
echo
根本不起作用)。是的,我还打算发布一个基于
printf
的答案。我认为这是最好的解决方案。我很好奇你会如何使用
eval
只回显“-e”。@JB。我也是。。。并不断地进行测试。刚刚更新显示:)但是。。。那还不能打印“-e”!要编写
-e
,我使用第一个解决方案。如果我想要的是
echo-e
行为,我使用
eval
。我不知道什么是真正的OP问题,一个或另一个:)我的问题是:你能让
echo
只打印字符串“-e”和“-e”吗?谢谢你的详细回答!我有个问题:你提到的echo的两个版本有什么不同?我在ubuntu上。如何启动它们?如果您在bash下,plain
echo
将为您提供shell内置,而
/usr/bin/echo
将为您提供独立的shell内置。(还有其他方法)您可以使用
--version
来区分它们。这个答案忽略了即使是bash内置的echo实现也不能保证行为一致。比较有无
shopt-s xpg_echo时的行为;设置-o posix
(请注意,前者——当shell处于posix模式时,使bash的
echo
posix兼容——默认情况下可以作为编译时标志启用)。坦率地说,这个问题并不值得。最好写为:
env POSIXLY_CORRECT=1 echo-e
。这不使用内置命令,而是使用外部命令。由于它很可能位于
/bin/echo
,您不妨这样称呼它:
POSIXLY\u CORRECT=1/bin/echo-e
。但是您的
printf
解决方案当然是最好的,也是最可移植的。