我希望能够输出一个字符串,其中可能包含与
例如:
echo
相同的参数。我该如何在不修改字符串的情况下实现?例如:
$ var="-e something"
$ echo $var
something
...没有打印出 -e
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"
请引用它:
$ 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.echo
仅打印字符串“-e”和“-e”吗? - JB.printf
:printf "%s\n" "$var"
echo
没起作用是因为当你运行时:var="-e something"
echo $var
如果不引用$var
,echo
将看到两个参数:-e
和something
。因为当echo
遇到-e
作为第一个参数时,它会认为这是一个选项(对于-n
和-E
也是如此),并进行处理。如果像其他答案中所示那样引用了var
,它就可以正常工作。
由于我们正在使用 bash,除了使用 echo
之外,另一种选择是简单地使用 cat
和一个“here string”:
$ var="-e something"
$ cat <<< "$var"
-e something
$ var="-e"
$ cat <<< "$var"
-e
$
< p > 基于 printf
的解决方案几乎肯定更具可移植性。 < /p >
$ env POSIXLY_CORRECT=1 echo -e
-e
echo
命令,使用未加修饰的 echo
在交互式或脚本中可能会得到与此处描述不同的功能。通过 env
调用它(即 env echo ...
)可避免来自 shell 的干扰。环境变量 POSIXLY_CORRECT
用于强制执行符合标准的行为。请参见:维基百科上的 POSIX。
或者使用 printf
:
$ printf '%s\n' "$var"
env POSIXLY_CORRECT=1 echo -e
。这不使用内置命令,而是外部命令。由于它很可能在 /bin/echo
中,因此您可以直接调用它:POSIXLY_CORRECT=1 /bin/echo -e
。但是,您的 printf
解决方案当然是最好和最便携的。 - gniourf_gniourfprintf
替代:var="-e bla"
printf "%s\n" "$var"
如果 var
只包含一个 -e
或类似字符,仅使用 echo "$var"
仍然会失败。如果您需要能够打印出来,请使用 printf
。
bash
的 echo
命令并不会特别处理 --
,它只是将其打印出来。 - chepnerprintf
的答案。我认为这是最好的解决方案。 - chepner
echo
将会得到shell内置的版本,而/usr/bin/echo
将会得到独立的版本。(还有其他方法)你可以使用--version
来区分它们。 - JB.shopt -s xpg_echo; set -o posix
开启和关闭时进行比较(请注意,前者在shell处于POSIX模式以外时,使bash的echo符合POSIX标准,可以作为编译时标志默认启用)。 - Charles Duffy