如何将多个内联“if”变量检查集成到“configure”标志选择中

如何将多个内联“if”变量检查集成到“configure”标志选择中

我正在 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,但这在引用和分词方面会很尴尬,效率稍低,而且可能有点难以阅读。不建议这样做。)

相关内容