如何在bash echo中打印出“-E”?

如何在bash echo中打印出“-E”?

我想执行 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

相关内容