#!/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"消失了,这会导致我的脚本出错。
感谢。
答案 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