初始“-e”在shell变量赋值中是否具有特殊含义?

时间:2018-03-03 16:31:09

标签: bash shell

我似乎无法将以“-e”或“-E”开头的字符串分配给bash shell变量:

$ options="-e stuff"
$ echo $options
stuff

其他字母工作正常:

$ options="-g stuff"
$ echo $options
-g stuff

这是什么原因?

2 个答案:

答案 0 :(得分:2)

你应该引用你的变量:

echo "${options}"

否则它将扩展到

echo -g stuff

echo作为-e选项的解释器,实际存在(请参阅man echo),这就是为什么-e“不起作用”而其他字母你试过“做过”。

答案 1 :(得分:2)

首先:要在bash中可靠地确定变量的值,请使用declare -p,而不是echo。因此:

declare -p options

将发出如下内容:

declare -- options="-e stuff"

这告诉你的不仅仅是echo

  • 因为它是declare --而非declare -x,您知道该变量未导出。
  • 因为它不是declare -a,你知道它没有给你一个数组(echo "$array"只打印一个shell数组的第一个元素而忽略其余的元素)。
  • 因为它不是declare -i,您知道该值未被声明为整数......等等。

如果您只担心字符串大小写,但希望确保无论使用哪个版本的bash,都会获得可打印的值(因为某些历史版本并不总是如此)保证打印用declare -p打印的值的可打印转义,请考虑:

printf '%q=%q\n' options "$options"

...即使字符串中有光标控制字符,换行符或其他非文本内容,也会发出明确的输出。

按照the POSIX specification for echo的建议,改为使用printf。为了完整引用 APPLICATION USAGE 部分,重点补充说明,在bash中,-e启用了转义序列的XSI样式解释:

  

无法在所有POSIX系统中移植使用echo   除非 -n(作为第一个参数)和转义序列都是   删去。

     

printf实用程序可以移植来模拟任何一个   echo实用程序的传统行为如下(假设   IFS有其标准值或未设置):

     

历史性的System V回声和对XSI实现的要求   在这卷POSIX.1-2008中相当于:

printf "%b\n" "$*"
     

BSD回声相当于:

if [ "X$1" = "X-n" ]
then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi
     

鼓励新应用使用printf代替echo

那么,这对你有什么用?由于您希望将-e视为数据,而不是echo设置的一部分,因此BSD,非-n分支适用:

options="-e stuff"
printf '%s\n' "$options"