我想执行 echo 并获得如下输出:
$ export EVAR="-E"
$ echo "$EVAR"
-E
我已将“-E”存储在 bash 变量中,例如$EVAR
.如果我执行echo $EVAR
, echo 将不会打印任何内容。也许它认为 $EVAR 是一个参数 -E。在双引号内引用$EVAR
也不起作用。
我怎样才能打印出来?
笔记:我想可能有一个解决方案,它不了解 $EVAR 的内容$EVAR
,不分析 $EVAR 的内容,例如echo some-arg $EVAR
.那可能吗?或者我应该只转向像这样的解决方法printf
?
答案1
你可以使用技巧:
echo " $EVAR"
echo -e "\055E"
echo $'\055E'
但正如我所说:这些都是技巧。真正的解决方案是始终使用 printf:
$ printf '%s\n' "$EVAR"
-E
答案2
根据请求,如果您同意输出前面有一个空行,请在命令行上自行测试此解决方案:
$ export EVAR="-E"
$ echo -e "\n$EVAR"
-E
- 原始内容
echo "$EVAR"
没有给出任何内容,因为正如您所怀疑的,它被视为命令-E
的公认选项echo
..man echo
说:-E disable interpretation of backslash escapes (default)
- 所以我们在它前面加上一个空白字符,在本例中是一个新行
- 但你不能直接使用
"\n"
,所以要使用-e
解释"\n"
- 当然,这意味着如果您仍然拥有原始内容
$EVAR
,则必须对输出执行其他操作以删除我们现在引入的第一个空行
答案3
printf
如前所述使用,或启用shopt xpg_echo
这会给你一个关闭达到标准echo
:
echo 'hi\nthere'
hi
there
但它仍然无法-E
正确处理参数。所以你可以编写自己的符合标准的小标准,echo
例如:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
...之后会大多echo
在各个方面都符合单一 Unix 规范(除了 a在处理八bash
printf
进制时也违反了标准)\[num]{1,3}
%b
。
...所以...
echo -E
-E
答案4
您可以使用printf
代替echo
:
$ EVAR="-E"
$ printf "%s\n" ${EVAR}
-E