我有以下脚本用于制作 webapp conf 文件(在 下/etc/nginx/sites-available/
)。
这是脚本:
#!/bin/sh
for domain; do
cat <<-WEBAPPCONF > /etc/nginx/sites-available/${domain}.conf
server {
root var/www/html/${domain};
server_name ${domain} www.${domain};
location / {
index index.php index.html index.htm fastcgi_index;
try_files $uri $uri =404 $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php*-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
WEBAPPCONF
ln -s /etc/nginx/sites-available/${domain}.conf /etc/nginx/sites-enabled/
done
systemctl restart nginx.service
鉴于它有for
一个domain
变量循环,我可以通过将这些域作为参数传递来为多个域运行它domain
:
bash ~/nwsm domain_1.tld domain_2.tld
我的问题
请假设出于某种原因我不喜欢使用循环for
并且每次只使用一个域:
如果我删除for domain; do ... done
语法,我认为我将无法将域作为参数传递,因为没有domain
变量将其保存为值。因此我问更改脚本以便它只处理一个域参数而不for
循环的正确方法是什么?
我不确定domain
在脚本开头添加是否是正确的方法。
附录
关于为什么有人想要这样做的一些无力的论据(因为for loop
说实话,效果很好):
1)追求极简主义时减少线条数量。
2)让自己在精神上一次只处理一个领域将减少额外打字和拼写错误的机会,并简化对已编写内容的验证。
3)for
当您使用稀疏数量的域(<=5 个域)时,在某些小型环境中使用循环是多余的。
答案1
domain="$1"
test -z "$domain" && exit 2
出口
第二行不是问题的答案。它将解决/减少如果使用位置参数循环则不会出现的问题。
如果(错误地)在没有位置参数的情况下调用脚本,那么在循环的情况下什么也不会发生。但非循环脚本在任何情况下都会运行,可能会造成损害,因为命令与其应有的样子不同。
因此,至少应该检查参数是否存在(更好:检查它是否是有效值)。如果参数具有非法值或为空(不存在),则脚本应中止。
shell 内置命令exit
中止当前 shell。这在交互式 shell 和 shell 脚本中都有效。exit
可以有一个非负整数作为参数(默认为零)。这是中止 shell 的退出代码。