我希望echo
一个字符串,其中可能包含与<{1}}相同的相同参数。如何在不修改字符串的情况下完成?
例如:
echo
...没有打印$ var="-e something"
$ echo $var
something
答案 0 :(得分:8)
一个非常深刻的问题。由于您标记了bash,我假设您的意思是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
会看到两个参数:-e
和something
。因为当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
。