我正在 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
在命令中使用一项或多项内联检查。我对整个命令的包装相当满意if
,但这并不适用于此。我想使用两个内联if
检查来查找 TLS 供应商并应用相关标志。
我尝试了各种可能有效的方法,但它们最终破坏了我的下载和编译脚本。
我将不胜感激一些指导和/或进一步阅读,以便我可以if
围绕两个--with-openssl
和--with-openssl-opt
标志整合两次连续检查。
谢谢。
答案1
有一些方法可以将条件与命令内联,但实际上,最好只是在数组中构建参数列表(至少是变化的参数列表),然后在运行程序时使用该数组。无论如何,只要您使用 Bash,因为数组不是标准功能。 (有关替代解决方案,请参阅下面的链接。)
如果您只是针对一组值测试单个变量,则 stamentcase
可能比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
,但这在引用和分词方面会很尴尬,效率稍低,而且可能有点难以阅读。不建议这样做。)