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的standaloneecho
命令可能工作得很类似
要点是:如果您真的需要使用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 SEbash
echo没有专门处理--
;它也可以打印。我建议另一个版本,因为我认为单独打印-e
可能很重要(这对echo
根本不起作用)。是的,我还打算发布一个基于printf
的答案。我认为这是最好的解决方案。我很好奇你会如何使用eval
只回显“-e”。@JB。我也是。。。并不断地进行测试。刚刚更新显示:)但是。。。那还不能打印“-e”!要编写-e
,我使用第一个解决方案。如果我想要的是echo-e
行为,我使用eval
。我不知道什么是真正的OP问题,一个或另一个:)我的问题是:你能让echo
只打印字符串“-e”和“-e”吗?谢谢你的详细回答!我有个问题:你提到的echo的两个版本有什么不同?我在ubuntu上。如何启动它们?如果您在bash下,plainecho
将为您提供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
解决方案当然是最好的,也是最可移植的。