스크립트에 대한 다중 매개변수

스크립트에 대한 다중 매개변수

명령줄에서 여러 인수를 사용하도록 아래 스크립트를 설정하려고 합니다. 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부터 슬라이싱을 시작하는 이유입니다.

내가 말했듯이 여기에는 다른 많은 일이 진행되고 있지만 이것이 매개변수에 대한 질문에 대한 답이 될 것입니다.

관련 정보