Bea*_*ear 1 bash environment-variables
#!/bin/bash
OPTS='-e EXTERNAL_PORT=443'
echo $OPTS
cat 1.txt
if [ $? -ne 0 ]; then
echo $OPTS
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到输出:
EXTERNAL_PORT=443
cat: 1.txt: No such file or directory
EXTERNAL_PORT=443
Run Code Online (Sandbox Code Playgroud)
如果我将 OPTS 更改为
OPTS='a -e EXTERNAL_PORT=443'
Run Code Online (Sandbox Code Playgroud)
现在一切正常了
a -e EXTERNAL_PORT=443
cat: 1.txt: No such file or directory
a -e EXTERNAL_PORT=443
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免这种情况?这是一个简化的演示,在我的真实案例中,我有一个以 -e 开头的环境变量 OPTS 。
我回显它,它是正确的,但是在 line 之后if [ $? -ne 0 ]; then,“-e”消失了,这会导致我的脚本出现错误。
谢谢。
echo将 解释-e为命令选项,这意味着它应该解释要打印的字符串中的任何转义序列,而不是解释为要打印的字符串的一部分。echo有许多“功能”可能会导致意外的麻烦(更糟糕的是,不同版本实现echo不同的选项)。试试这个:
$ OPTS='-e EXTERNAL_PORT=443'
$ printf '%s\n' "$OPTS"
-e EXTERNAL_PORT=443
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果命令选项中有空格(或者有时有任何 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
Run Code Online (Sandbox Code Playgroud)