명령줄에서 여러 인수를 사용하도록 아래 스크립트를 설정하려고 합니다. LetsEncrypt에서 SSL 인증서를 요청하는 스크립트를 사용하고 있습니다. 스크립트는 현재 한 번에 하나의 도메인을 가져오지만 여러 대체 이름(예: domain.txt)이 있는 도메인에 대한 인증서를 요청하는 데 사용할 수 있도록 여러 명령줄 인수를 허용하도록 설정하고 싶습니다. ). com 및 www.domain.com) CERTNAME="${2}"
으로 변경하려고 시도했지만 계속 멈춥니다 CERTNAME="$@"
. 이와 같이 스크립트를 실행하면 작동 CERTNAME=$(echo "${2}" | sed -n "s/.*'\([^']\+\)'.*/\1/p")
하지만 이와 같은 다른 매개변수를 추가하자마자 작동하지 않습니다. 내가 뭘 잘못했나요? 스크립트는 다음과 같습니다. CERTNAME=$(echo "$@" | sed -n "s/.*'\([^']\+\)'.*/\1/p")
echo "error: wrong CERTTYPE"
./<script name> --issue c_domain.com_rsa
./<script name> --issue c_domain.com_rsa c_www.domain.com_rsa
#!/bin/bash
if [ "$1" = "--issue" ]; then
CERTNAME="${2}"
else
CERTNAME=$(echo "${2}" | sed -n "s/.*'\([^']\+\)'.*/\1/p")
fi
CERTFILE=$(echo "${CERTNAME}" | cut -d'_' -f 2)
CERTTYPE=$(echo "${CERTNAME}" | cut -d'_' -f 3)
if [ -z "$CERTNAME" ] || [ -z "$CERTFILE" ] || [ -z "$CERTTYPE" ]; then
echo "error, can't figure out CERTNAME or CERTFILE or CERTTYPE"
exit 1
fi
ZCLI=$(locate zcli 2>/dev/null | egrep "test/bin/zcli$")
[ -z "$ZCLI" ] && ZCLI=$(which zcli)
[ -z "$ZCLI" ] && ZCLI=$(find / -name zcli | egrep "test/bin/zcli$")
if [ -z "$ZCLI" ]; then
echo "Can't find zcli command"
exit 1
fi
ACMEHOME="/root/certs/"
ACMEOPTIONS="--standalone --httpport 88"
TEST="--test --days 0"
case "$CERTTYPE" in
ecc)
ACMEKEY="--keylength ec-256"
CERTDIR=$ACMEHOME/${CERTFILE}_${CERTTYPE}
;;
rsa)
ACMEKEY="--keylength 2048"
CERTDIR=$ACMEHOME/${CERTFILE}
;;
*)
echo "error: wrong CERTTYPE"
exit 1
esac
if [ -d $CERTDIR ]; then
# certificate renewal
ACMEACTION="--renew"
if [ "$CERTTYPE" = "ecc" ]; then
ACMEKEY="--ecc"
fi
else
# certificate issuance
ACMEACTION="--issue"
fi
$ACMEHOME/acme.sh $TEST $ACMEOPTIONS $ACMEACTION -d ${CERTFILE} $ACMEKEY
# key
key=$(cat $CERTDIR/${CERTFILE}.key)
key=${key//$'\n'/\\n}
# crt
crt=$(cat $CERTDIR/fullchain.cer)
crt=${crt//$'\n'/\\n}
echo "Catalog.SSL.Certificates.setRawCertificate ${CERTNAME} \"$crt\" " >
$CERTDIR/zcli_${CERTFILE}.script
$ZCLI $CERTDIR/zcli_${CERTFILE}.script
if [ $? -ne 0 ]; then
echo "Catalog.SSL.Certificates.importCertificate ${CERTNAME} { private_key:
\"$key\", public_cert: \"$crt\" }" > $CERTDIR/zcli_${CERTFILE}.script
$ZCLI $CERTDIR/zcli_${CERTFILE}.script
fi
echo "Done!"
답변1
스크립트의 나머지 부분에서 무슨 일이 일어나고 있는지 잘 모르겠지만 위치 매개변수를 올바르게 처리하지 못하고 있습니다. CERTNAME
로 설정하면 $@
를 포함한 모든 매개변수가 포함된 문자열로 설정됩니다 --include
. 그런 다음 이 문자열에서 실행 중이므로 cut
무엇을 기대하는지 잘 모르겠습니다. 매개변수를 반복하려면 다음을 수행하십시오.
#!/bin/bash
if [[ "$1" = "--issue" ]]; then
certs=("${@:2}")
else
:
# something else here
fi
for cert in "${certs[@]}"; do
echo "$cert"
# process each cert here
done
exit
마지막 예를 보면 다음과 같이 인쇄됩니다.
c_domain.com_rsa
c_www.domain.com_rsa
이는 모든 위치 매개변수(제외됨)를 $1
배열에 넣고 이를 반복합니다. 나머지 매개변수를 문자열에 넣으려면 다음과 같이 괄호를 제거하면 됩니다.certs="${@:2}"
이런 식 으로 사용하는 것은 $@
약간 혼란스럽습니다 . "$@"
위치 인수를 단어로 확장한다고 하면, 즉 $1
... . $n
그러나 내가 했던 것처럼 배열 컨텍스트에서 이를 사용하면 $0
스크립트 이름인 include가 포함됩니다. 이것이 바로 요소 2부터 슬라이싱을 시작하는 이유입니다.
내가 말했듯이 여기에는 다른 많은 일이 진행되고 있지만 이것이 매개변수에 대한 질문에 대한 답이 될 것입니다.