我似乎无法将以“-e”或“-E”开头的字符串分配给bash shell变量:
$ options="-e stuff"
$ echo $options
stuff
其他字母工作正常:
$ options="-g stuff"
$ echo $options
-g stuff
这是什么原因?
答案 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"