将多个用户输入添加到 shell 脚本中的逗号分隔行中

将多个用户输入添加到 shell 脚本中的逗号分隔行中

我必须获取多个域名的用户输入,直到用户完成输入。输入可以是一个域名,也可以是多个域名。并且域名应该用逗号分隔,

如何将域名传递给以下命令。请帮助我。

keytool -genkey -keystore tc_keystore.jks -keysize 2048 -keypass password -storepass password -keyalg RSA \
 -dname "CN=domain1.com,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US" \
 -alias domain1.com -ext san=dns:domain2,domain3,domain4,domain5,domain6,domain7

由于我是 shell 脚本的新手,我正在读取单个用户输入并将其存储在变量中并调用该变量。就像下面这个一样。但是当涉及到应该用逗号分隔的多个用户输入时,我陷入了困境。

keytool -genkey -keystore $keystore -keysize 2048 -keypass $password -storepass $password -keyalg RSA \
 -dname "CN=$domain1,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US" \
 -alias $domain1 -ext san=dns:domain2,domain3,domain4,domain5,domain6,domain7

答案1

让用户向脚本提供数据的常见方法是通过其命令行参数。例如,在这种情况下,使用域名列表调用脚本会很方便。由于用户需要提供密码和其他一些与密钥相关的参数,因此我们可以开发一个包含两个选项和一个域列表的脚本。

./script -p 'password' -k 'keystore' domain1 domain2 domain3 ...

我不知道keytool您正在使用的实用程序,但似乎用户必须提供至少两个域的列表,而不仅仅是一个域。第一个域名与-dname和选项一起使用-alias,而该-ext选项在其值中采用第二个域名和任何其他域名。

以下代码使用惯用的方式解析命令行选项并验证 和keystore变量password是否具有值。然后,它keytool使用用户提供的数据调用该实用程序。

#!/bin/sh

unset -v keystore password

while getopts k:p: opt; do
        case $opt in
                k)
                        keystore=$OPTARG
                        ;;
                p)
                        password=$OPTARG
                        ;;
                *)
                        echo 'Error' >&2
                        exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

if [ -z "$keystore" ] || [ -z "$password" ]; then
        echo 'Missing keystore (-k) and/or password (-p)' >&2
        exit 1
fi

if [ "$#" -lt 2 ]; then
        echo 'Expecting at least two domain names' >&2
        echo '(a main one, and one for the -ext option)' >&2
        exit 1
fi

domain1=$1
shift

IFS=,

keytool -genkey \
        -keystore "$keystore"   \
        -keysize 2048   \
        -keypass "$password"    \
        -storepass "$password"  \
        -keyalg RSA     \
        -dname "CN=$domain1,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US"  \
        -alias "$domain1"       \
        -ext "san=dns:$*"

在第一个shift语句之后,第一个域名将在 中$1,其他域名将在$2, $3, 中,依此类推。我们分配$1domain1变量并调用shift.在第二个之后shift,我们可以使用"$*"withIFS设置为逗号来生成其余域名的逗号分隔字符串。我们在选项的值中使用它-ext

相关内容