如何在文件名中使用变量?

use*_*695 15 bash shell-script

如何正确使用文件名中的变量?这就是我正在做的,但下划线似乎有一些问题:

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
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 22

在这种情况下,Bash 解释domain_为要扩展的变量的名称。它是变量的有效名称。扩展此名称不是您想要的。您需要告诉 Bash 预期名称的结束位置。这样做${}; 在这种情况下${domain},像这样:

/opt/nginx/conf.d/com_${domain}_${sub}.conf
Run Code Online (Sandbox Code Playgroud)

在这里我使用了${sub}即使$sub.conf不会被误解(因为.在 shell 变量的名称中是不允许的);我想告诉你,${}在不需要的地方使用仍然可以。

当您的 shell 将其domain_视为名称时,该变量将扩展为空字符串。这个变量从未被声明过,但它正式扩展成功。使用未设置的变量通常不是错误。Invokeset -u和 Bash 会将未设置的变量视为错误(set +u如果需要则还原)。

将未设置的变量视为错误对于调试很有用,而且在防御性脚本编写中也很有用。除非您有意允许未设置的变量,否则脚本在尝试扩展未设置的变量时立即失败通常比继续使用错误的值要好。使用变量指定路径名时,“错误值”可能意味着“要覆盖或删除的文件错误”。

记得引用正确的。您示例中的值在未引用时是安全的,但习惯引用仍然很好。如果您可以在没有引号的情况下离开,那么习惯性地引用 IMO 比每次分析都更容易且不易出错。

/opt/nginx/conf.d/com_${domain}_${sub}.conf
Run Code Online (Sandbox Code Playgroud)