我怎么回应“-e”?

时间:2013-11-15 14:40:32

标签: string bash echo

我希望echo一个字符串,其中可能包含与<{1}}相同的相同参数。如何在不修改字符串的情况下完成?

例如:

echo

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

6 个答案:

答案 0 :(得分:8)

一个非常深刻的问题。由于您标记了,我假设您的意思是bash的内部echo命令,尽管GNU coreutils'独立echo命令的工作方式可能与此类似。

它的要点是:如果你真的需要使用echo(这会令人惊讶,但这就是现在问题的写法),这一切都取决于什么确切地说你的字符串可以包含。

简单案例:-e加上非空字符串

在这种情况下,您需要做的就是在将变量传递给echo之前引用该变量。

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

如果字符串不是ephctly echo选项或组合(包括任何非选项后缀),则echo将不会识别该字符串并将其打印出来。

更难:字符串只能是-e

如果您的案例可以减少到只有“-e”,那就会变得更加棘手。一种方法是:

$ echo -e '\055e'
-e

(转义破折号,因此它不会被解释为一个选项,而是像八进制序列一样)

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

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

您注意到我实际上使用-e选项来解释八进制序列,因此如果您打算echo -E,它将无效。不过,它适用于其他选项。

正确的方式

说真的,你不仅限于echo,是吗?

printf '%s\n' "$var"

答案 1 :(得分:3)

正确的bash方式是使用printf

printf "%s\n" "$var"

顺便说一句,你的echo无效,因为你跑的时候:

var="-e something"
echo $var

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

答案 2 :(得分:2)

引用它:

$ 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

答案 3 :(得分:2)

由于我们正在使用bash,echo的另一种替代方法是cat一个"here string"

$ var="-e something"
$ cat <<< "$var"
-e something
$ var="-e"
$ cat <<< "$var"
-e
$ 
基于{p> printf的解决方案几乎肯定会更便携。

答案 4 :(得分:2)

尝试以下方法:

$ env POSIXLY_CORRECT=1 echo -e
-e
  

由于shell别名和内置echo命令,使用了朴实的   交互式地或在脚本中echo可以为您提供不同的功能   比这里描述的那样。通过env调用它(即env echo ...)   避免来自外壳的干扰。

     

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

或使用printf

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

来源:stackoverflow SE的Why is bash swallowing -e in the front of an array

答案 5 :(得分:1)

改为使用printf

var="-e bla"
printf "%s\n" "$var"
如果echo "$var"仅包含var或类似内容,

仅使用-e仍然会失败。如果您还需要打印,请使用printf