如何正确使用文件名中的变量?这就是我正在做的事情,但下划线似乎出现了一些问题:
domain="example"
sub="foo"
if [ -f /opt/nginx/conf.d/com_$domain_$sub.conf ]
cat <<EOF > /opt/nginx/conf.d/com_$domain_$sub.conf
some multiline
content
EOF
fi
答案1
在这种情况下,Bash 解释domain_
为要扩展的变量的名称。这是变量的有效名称。扩展此名称不是您想要的。您需要告诉 Bash 预期名称的结束位置。这样做${}
;在这种情况下${domain}
,像这样:
/opt/nginx/conf.d/com_${domain}_${sub}.conf
在这里我使用了${sub}
即使$sub.conf
不能被误解(因为.
在 shell 变量的名称中不允许);我想向您展示,${}
在不必要的地方使用仍然可以。
当您的 shell 将其domain_
视为名称时,该变量将扩展为空字符串。该变量从未声明过,但它正式扩展成功。使用未设置的变量通常不是错误。 Invokeset -u
和 Bash 会将未设置的变量视为错误(set +u
如果需要则恢复)。
将未设置的变量视为错误对于调试很有用,而且对于防御性脚本编写也很有用。除非您故意允许未设置的变量,否则脚本在尝试扩展未设置的变量时立即失败通常比继续使用错误的值更好。当使用变量指定路径名时,“错误值”可能意味着“覆盖或删除错误的文件”。
还记得正确引用。您的示例中的值在未加引号时是安全的,但习惯引用仍然很好。 IMO 习惯性地引用比每次分析都更容易,也更不容易出错,如果你可以不引用的话。
if [ -f "/opt/nginx/conf.d/com_${domain}_$sub.conf" ]