スクリプトの複数パラメータ

スクリプトの複数パラメータ

コマンドラインで複数の引数を使用するように以下のスクリプトを設定しようとしています。 LetsEncryptからSSL証明書を要求するスクリプトを使用しています。スクリプトは現在一度に1つのドメインを取得していますが、複数の代替名(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からスライスを開始する理由です。

私が言ったように、ここには他の多くのことが行われていますが、これはパラメータに関する質問に対する答えになります。

関連情報