스크립트를 작성하는 동안 현재까지 해결할 수 없는 "이상한" 문제에 직면하고 있습니다.
typeset -r SERVICE=\"ldap://localhost:10389\ ldaps://solsrv02.internal.vbox:10689\ ldaps://solsrv02.prod.internal.vbox:10689\"
SLAPD="/usr/lib/slapd -u ${LDAPUSR} -g ${LDAPGRP} -h ${SERVICE} -F ${CONF_DIR}"
현재 변수는 위와 같이 할당되어 있으며 SLAPD를 에코하면 매력처럼 작동합니다. 하지만 명령을 실행하면 다음과 같이 출력됩니다.
/usr/lib/slapd -u openldap -g openldap -h "ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689" -F /etc/openldap/standalone
디버그 출력
+ [[ ! -d /var/openldap/run ]]
+ /bin/rm -f /var/openldap/run/slapd.pid
+ /usr/lib/slapd -u openldap -g openldap -h '"ldap://localhost:10389' ldaps://solsrv02.internal.vbox:10689 'ldaps://solsrv02.prod.internal.vbox:10689"' -F /etc/openldap/standalone
따라서 이제 내 문제는 openldap 명령줄에서 -h "URL"을 지정하고 이를 변수에 추가하도록 강제한다는 것입니다. 그러면 해당 변수는 내가 원하는 단일 매개변수 대신 3개의 매개변수로 사용됩니다.
따옴표를 백스페이스로 바꾸려고 했지만 작은따옴표 3개로 늘어났습니다. echo 출력을 복사하여 스크립트에 붙여넣으면 작동합니다. 하지만 이는 사용자 정의에 변수를 사용할 수 없다는 단점이 있습니다.
모든 변수가 설정되었습니다.typeset -r
업데이트 1
Cas의 답변을 바탕으로 코드를 업데이트했지만 여전히 동일한 문제에 직면합니다.
#!/usr/bin/bash
echo $SHELL
typeset -r SLAPD=/usr/lib/slapd
typeset -r LDAPUSR=openldap
typeset -r LDAPGRP=openldap
typeset -r VARRUNDIR=/var/openldap/run
typeset -r PIDFILE=${VARRUNDIR}/slapd.pid
typeset -r CONF_DIR=/etc/openldap/standalone
typeset -r SERVICE=(ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689)
SLAPARGS=" -u ${LDAPUSR}"
SLAPARGS+=" -g ${LDAPGRP}"
SLAPARGS+=" -F ${CONF_DIR}"
SLAPARGS+=" -h "
SIZE=${#SERVICE[@]}
#for i in {1..${#SERVICE[@]}$}; do
SLAPARGS+="'"
for ((i=0;i<$SIZE;i=$i+1)); do
SLAPARGS+="${SERVICE[$i]} "
done
SLAPARGS+="'"
[[ ! -d ${CONF_DIR} ]] && exit $SMF_EXIT_ERR_CONFIG
echo "$SLAPD $SLAPARGS"
set -x
$SLAPD $SLAPARGS 2>&1
출력은 다음과 같습니다:
/usr/bin/bash
/usr/lib/slapd -u openldap -g openldap -F /etc/openldap/standalone -h 'ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689 '
+ [[ ! -d /var/openldap/run ]]
+ /bin/rm -f /var/openldap/run/slapd.pid
+ /usr/lib/slapd -u openldap -g openldap -F /etc/openldap/standalone -h ''\''ldap://localhost:10389' ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689 ''\'''
배쉬 버전은 4.1.17입니다.
답변1
다음과 같이 시도해 보세요.
SLAPD='/usr/bin/slapd'
SERVICE='ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689'
SLAPDARGS="-u '${LDAPUSR}'"
SLAPDARGS+=" -g '${LDAPGRP}'"
SLAPDARGS+=" -h '${SERVICE}'"
SLAPDARGS+=" -F '${CONFDIR}'"
$SLAPD $SLAPDARGS
이 방법으로 무엇을 하는지 볼 수 있습니다( $LDAPUSR
, $LDAPGRP
및 $CONFDIR
올바르게 정의된 후에 실행될 때).
$ echo $SLAPD $SLAPDARGS
/usr/bin/slapd -u 'ldap' -g 'ldap' -h 'ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689' -F '/etc/ldap'
쉘이 이를 지원하지 않는 경우 +=
대신 다음을 사용하십시오.
SLAPDARGS="-u '${LDAPUSR}'"
SLAPDARGS="${SLAPDARGS} -g '${LDAPGRP}'"
SLAPDARGS="${SLAPDARGS} -h '${SERVICE}'"
SLAPDARGS="${SLAPDARGS} -F '${CONFDIR}'"
핵심은 보간 및 전역 확장 등이 필요하지 않을 때 작은 따옴표를 사용하고 필요할 때 따옴표를 사용하지 않거나 큰 따옴표를 사용하는 것입니다. 예를 들어, $SLAPDARGS
실행하는 명령줄에서 이것을 사용할 때 따옴표를 사용하고 싶지 않습니다. $SLAPD
그렇지 않으면 따옴표가 단일 인수로 전달됩니다 slapd
.
또 다른 대안은 SLAPDARGS에 단순 문자열 대신 배열을 사용하는 것입니다.
그런데, 스크립트 줄 길이를 80열 미만으로 유지하려면 $SERVICE
이전과 같은 방식으로 단계별로 작성할 수 $SLAPDARGS
있으며 간단한 문자열 대신 배열로 정의할 수도 있습니다.