複数のインライン「if」変数チェックを「設定」フラグ選択に組み込む方法

複数のインライン「if」変数チェックを「設定」フラグ選択に組み込む方法

BashのDebian 12ソースからNginxをコンパイルしています。プリフライト変数()を介して$nginx_tls_vendorTLSプロバイダ(LibreSSL、OpenSSLなど)を選択したいと思います。configure変数のないコマンド例は次のとおりです。

./configure \
--with-foo \
[…]
--with-openssl=/src/vendor/library-1.2.3 \
--with-openssl-opt="baz" \
[…]
--with-bar \

--with-opensslそしてフラグの値は--with-openssl-opt異なります$nginx_tls_vendor。すべてのベンダーはおおよそ次のとおりです。

if [ "$nginx_tls_vendor" = "libressl" ] \
; then \
--with-openssl=/src/libressl/libressl-1.2.3 \
--with-openssl-opt="baz-libressl etc" \
; fi 
if [ "$nginx_tls_vendor" = "openssl" ] \
; then \
--with-openssl=/src/openssl/openssl-3.2.1 \
--with-openssl-opt="baz-openssl etc" \
; fi 

ifコマンドで1つ以上のインラインチェックを使用する方法が見つかりませんでした。私は完全なコマンドラッパーに非常に満足していますifが、ここには適用されません。 2つのインラインチェックを使用してifTLSプロバイダを見つけ、関連するフラグを適用したいと思います。

動作するさまざまな方法を試しましたが、最終的にダウンロードとコンパイルスクリプトが破損しています。

if2つの--with-opensslチェックマークと--with-openssl-opt2つの連続チェックを統合できるように、いくつかのガイドラインおよび/または追加情報をお読みいただきありがとうございます。

ありがとうございます。

答え1

コマンドを使用して条件をインライン化する方法がありますが、実際には配列に引数リスト(少なくともさまざまな引数リスト)を構築してから、プログラムを実行するときにその配列を使用する方がよいでしょう。とにかくBashを使用する限り、配列は標準機能ではないからです。 (代替ソリューションについては、以下のリンクを参照してください。)

一連の値に対して単一の変数をテストする場合、Stamentはcaseおそらくifif

主な部分は、args+=(foo)配列に追加された割り当てと配列拡張です"${args[@]}"

このような:

args=()
case "$nginx_tls_vendor" in
    libressl) 
        args+=(
        --with-openssl=/src/libressl/libressl-1.2.3
        --with-openssl-opt="baz-libressl etc"
        );;
    openssl) 
        args+=(
        --with-openssl=/src/openssl/openssl-3.2.1
        --with-openssl-opt="baz-openssl etc"
        );;
    *) 
        echo >&2 "error: invalid value of 'nginx_tls_vendor'"
        exit 1;;
esac

./configure --with-foo "${args[@]}" --with-bar

あるいは、連想配列を適用することもできます(Bashでも同様)。

declare -A openssl_libs=(
    [libressl]=/src/libressl/libressl-1.2.3
    [openssl]=/src/openssl/openssl-3.2.1
)
declare -A openssl_opts=(
    [libressl]="baz-libressl etc"
    [openssl]="baz-openssl etc"
)

./configure \
  --with-foo \
  --with-openssl="${openssl_libs[$nginx_tls_vendor]}" \
  --with-openssl-opt="${openssl_opts[$nginx_tls_vendor]}" \
  --with-bar \

#end

(しかしそこに間違った値があるかどうか注意してください$nginx_tls_vendor。)

また見なさい:

(技術的には、パラメータifリストのコマンド置換にステートメントを直接挿入することはできますが、configureこれは引用と単語の分離の点で厄介で、少し効率が悪く、読みにくい場合があります。お勧めできません。)

関連情報