首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初始"-e“在shell变量赋值中是否有特殊意义?

初始"-e“在shell变量赋值中是否有特殊意义?
EN

Stack Overflow用户
提问于 2018-03-03 16:31:09
回答 2查看 43关注 0票数 0

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

代码语言:javascript
运行
复制
$ options="-e stuff"
$ echo $options
stuff

其他信件运作良好:

代码语言:javascript
运行
复制
$ options="-g stuff"
$ echo $options
-g stuff

原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-03 16:33:19

你应该引用你的变量:

代码语言:javascript
运行
复制
echo "${options}"

否则它会被扩展到

代码语言:javascript
运行
复制
echo -g stuff

它是由echo作为它的-e选项的解释器,它实际上是存在的(参见man echo),这就是为什么-e“不能工作”,而其他您试过的字母“不工作”。

票数 2
EN

Stack Overflow用户

发布于 2018-03-03 18:06:55

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

代码语言:javascript
运行
复制
declare -p options

会发出类似于:

代码语言:javascript
运行
复制
declare -- options="-e stuff"

这比echo告诉您的要多得多:

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

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

代码语言:javascript
运行
复制
printf '%q=%q\n' options "$options"

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

遵循echo的建议,使用printf代替。为了全面引用应用程序使用部分,添加了强调部分,注意在bash中,-e支持XSI风格的转义序列解释:

不可能在所有POSIX系统中可移植地使用回波,除非同时省略-n (作为第一个参数)和转义序列。 printf实用程序可移植地用于模仿echo实用程序的任何传统行为,如下所示(假设IFS有其标准值或未设置): POSIX.1-2008这一卷中的历史性系统V回波和对XSI实现的要求相当于: 打印"%b\n“"$*” BSD回波相当于: 如果"X$1“= "X-n”,则将printf "%s“”%s“"$*”转换为"%s\n“"$*”fi 鼓励新应用程序使用printf而不是echo

那么,这怎么适用于你呢?由于您希望-e被视为数据,而不是echo设置的一部分,所以BSD的非-n分支适用于:

代码语言:javascript
运行
复制
options="-e stuff"
printf '%s\n' "$options"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49086474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档