BashのDebian 12ソースからNginxをコンパイルしています。プリフライト変数()を介して$nginx_tls_vendor
TLSプロバイダ(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つのインラインチェックを使用してif
TLSプロバイダを見つけ、関連するフラグを適用したいと思います。
動作するさまざまな方法を試しましたが、最終的にダウンロードとコンパイルスクリプトが破損しています。
if
2つの--with-openssl
チェックマークと--with-openssl-opt
2つの連続チェックを統合できるように、いくつかのガイドラインおよび/または追加情報をお読みいただきありがとうございます。
ありがとうございます。
答え1
コマンドを使用して条件をインライン化する方法がありますが、実際には配列に引数リスト(少なくともさまざまな引数リスト)を構築してから、プログラムを実行するときにその配列を使用する方がよいでしょう。とにかくBashを使用する限り、配列は標準機能ではないからです。 (代替ソリューションについては、以下のリンクを参照してください。)
一連の値に対して単一の変数をテストする場合、Stamentはcase
おそらくif
。if
主な部分は、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
これは引用と単語の分離の点で厄介で、少し効率が悪く、読みにくい場合があります。お勧めできません。)