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一度に1つのドメインしか使用しないとします。

構文を削除すると、ドメインを値として保持する変数がfor domain; do ... doneないため、ドメインをパラメータとして渡すことはできないようです。そのため、ループなしdomainで1つのドメインパラメータのみを処理するようにスクリプトを変更する正しい方法が何であるかを尋ねています。for

domainスクリプトの先頭に追加するのが正しい方法かどうかはわかりません。

付録

なぜ誰かがこれをしたいのかについてのいくつかの弱い主張(for loop正直に言うと、うまく機能するからです):

1)ミニマリズムを追求するときは、行数を減らしてください。

2)一度に 1 つの領域で精神的に作業できるようにすることで、追加の入力やスペルエラーの可能性が減り、作成された内容を簡単に確認できます。

三)forループの使用は、ドメイン数が少ない(<= 5ドメイン)一部の小規模環境では重複します。

ベストアンサー1

domain="$1"
test -z "$domain" && exit 2

出口

2行目は質問に対する答えではありません。位置パラメータを使用したループを使用している場合に発生しない問題を解決/減らします。

(誤って)位置引数なしでスクリプトを呼び出すと、ループの場合は何も起こりません。ただし、非ループスクリプトはいかなる場合でも実行され、コマンドが元のものと異なるため、潜在的に破損する可能性があります。

したがって、少なくともパラメータが存在することを確認する必要があります(より良い:有効な値であることを確認することをお勧めします)。パラメータに無効な値があるか空の場合(存在しない場合)、スクリプトは中断されます。

シェル組み込みコマンドはexit現在のシェルを終了します。これは対話型シェルとシェルスクリプトの両方で機能します。exit非負の整数を引数として持つことができます(デフォルトは0)。シェルを終了する終了コードです。

おすすめ記事