如何在不使用 for 循环的情况下将参数传递给 Bash 脚本变量?

如何在不使用 for 循环的情况下将参数传递给 Bash 脚本变量?

我有以下脚本用于制作 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 的退出代码。

相关内容