여러 인라인 "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명령에서 하나 이상의 인라인 검사를 사용하는 방법을 찾지 못했습니다 . 나는 전체 명령 래퍼에 매우 만족 if하지만 여기에는 적용되지 않습니다. 두 가지 인라인 검사를 사용하여 ifTLS 공급자를 찾고 관련 플래그를 적용하고 싶습니다.

작동할 수 있는 다양한 방법을 시도했지만 결국 다운로드 및 컴파일 스크립트가 손상되었습니다.

if두 가지 --with-openssl및 표지판에 대한 --with-openssl-opt두 가지 연속 점검을 통합 할 수 있도록 몇 가지 지침 및/또는 추가 정보를 읽어주시면 감사하겠습니다 .

감사해요.

답변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이는 인용 및 단어 분리 측면에서 어색하고 약간 덜 효율적이며 읽기 어려울 수 있습니다. 권장되지 않습니다.)

관련 정보