-e消失在环境变量中,如何避免这种情况?

时间:2017-07-29 07:35:04

标签: bash environment-variables

#!/bin/bash

OPTS='-e EXTERNAL_PORT=443'

echo $OPTS

cat 1.txt
if [ $? -ne 0 ]; then
    echo $OPTS
    exit 1
fi

在这种情况下,我得到了输出:

EXTERNAL_PORT=443
cat: 1.txt: No such file or directory
EXTERNAL_PORT=443

如果我将OPTS更改为

OPTS='a -e EXTERNAL_PORT=443'

现在它正常工作

a -e EXTERNAL_PORT=443
cat: 1.txt: No such file or directory
a -e EXTERNAL_PORT=443

我该如何避免这种情况?这是一个简化的演示,在我的实际案例中,我有一个环境变量OPTS以-e开头。

我回应它,​​它是正确的,但在行if [ $? -ne 0 ]; then之后," -e"消失了,这会导致我的脚本出错。

感谢。

1 个答案:

答案 0 :(得分:4)

echo-e解释为命令选项,这意味着它应该解释要打印的字符串中的任何转义序列,而不是作为要打印的字符串的一部分。 echo有许多可能导致意外麻烦的“功能”(更糟糕的是,echo的不同版本会实现不同的选项)。试试这个:

$ OPTS='-e EXTERNAL_PORT=443'
$ printf '%s\n' "$OPTS"
-e EXTERNAL_PORT=443

顺便说一下,如果任何一个字符串中有任何空格(或者有时是任何shell通配符,或者......),那么将它们存储在普通字符串中是行不通的。最好为它们使用一个数组,然后双引号数组引用以防止shell搞乱它。最好使用小写(或大小写混合的)变量名来避免与shell和其他程序使用的特殊变量冲突(它们都是大写的):

$ opts=(-e EXTERNAL_PORT=443 -e COMMENT="This is a test")
$ printf '%s\n' "${opts[@]}"
-e
EXTERNAL_PORT=443
-e
COMMENT=This is a test