コマンドラインで複数の引数を使用するように以下のスクリプトを設定しようとしています。 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からスライスを開始する理由です。
私が言ったように、ここには他の多くのことが行われていますが、これはパラメータに関する質問に対する答えになります。