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를 사용하는 한 배열은 표준 기능이 아니기 때문입니다. (대체 솔루션은 아래 링크를 참조하세요.)
일련의 값에 대해 단일 변수를 테스트하는 경우 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
이는 인용 및 단어 분리 측면에서 어색하고 약간 덜 효율적이며 읽기 어려울 수 있습니다. 권장되지 않습니다.)