쉘 스크립트에서 쉼표로 구분된 줄에 여러 사용자 입력 추가

쉘 스크립트에서 쉼표로 구분된 줄에 여러 사용자 입력 추가

사용자가 입력을 완료할 때까지 여러 도메인 이름에 대한 사용자 입력을 받아야 합니다. 입력은 하나의 도메인 이름이거나 여러 도메인 이름일 수 있습니다. 그리고 도메인 이름은 쉼표로 구분해야 합니다 ,.

도메인 이름을 다음 명령에 어떻게 전달할 수 있습니까? 도와주세요.

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

저는 쉘 스크립팅을 처음 사용하기 때문에 단일 사용자 입력을 읽고 이를 변수에 저장하고 해당 변수를 호출합니다. 아래의 것과 같습니다. 하지만 여러 사용자 입력을 쉼표로 구분해야 하는 경우에는 문제가 발생합니다.

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등이 됩니다. 변수 $1에 할당 하고 를 호출합니다 . 두 번째 이후에는 쉼표 로 설정하여 나머지 도메인 이름의 쉼표로 구분된 문자열을 생성 할 수 있습니다 . 우리는 그것을 옵션의 value 에 사용합니다 .domain1shiftshift"$*"IFS-ext

관련 정보