我似乎无法将以"-e“或"-E”开头的字符串分配给bash变量:
$ options="-e stuff"
$ echo $options
stuff其他信件运作良好:
$ options="-g stuff"
$ echo $options
-g stuff原因是什么?
发布于 2018-03-03 16:33:19
你应该引用你的变量:
echo "${options}"否则它会被扩展到
echo -g stuff它是由echo作为它的-e选项的解释器,它实际上是存在的(参见man echo),这就是为什么-e“不能工作”,而其他您试过的字母“不工作”。
发布于 2018-03-03 18:06:55
首先:要可靠地确定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"即使您的字符串中有游标控制字符、换行符或其他非文本内容,...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分支适用于:
options="-e stuff"
printf '%s\n' "$options"https://stackoverflow.com/questions/49086474
复制相似问题