여러 변수에 "읽기" 사용

여러 변수에 "읽기" 사용

그래서 저는 기본적으로 Docker 애플리케이션을 빠르게 실행하기 위한 스크립트를 작성하고 있으며 모든 것이 잘 작동하고 제가 코딩한 모든 작업을 수행합니다.

내 기능 중 하나에 대해 질문이 있습니다.

function prompt_user() {
    echo "Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank."
    echo "If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before"
    echo " "
    echo "Enter details:"
    read -p "Image Name: " IMAGE_NAME
    read -p "IP Address: " IP_ADDRESS
    read -p "Port 1: " PORT_ONE
    read -p "Port 2: " PORT_TWO
    read -p "Container Name: " CONTAINER_NAME
    read -p "Node Name: " NODE_NAME
    read -p "Host Directory (Can leave this blank if you're building a new image): " HOST_DIRECTORY
    read -p "Remote Directory (Can leave this blank if you're building a new image): " REMOTE_DIRECTORY
}

중복 읽기를 줄이고 모든 입력을 변수에 할당하는 더 쉬운 방법이 있습니까?

여기확인하고 싶다면 전체 스크립트가 있습니다.

답변1

이것이 기존 함수보다 얼마나 깔끔한지는 잘 모르겠지만 for 루프와 결합된 연관 배열(bash v4.0 이상 필요)을 사용하면 시간 읽기를 사용할 수 있습니다.

function prompt_user() {
    declare -A prompt_questions
    vars=(IMAGE_NAME IP_ADDRESS PORT_ONE PORT_TWO CONTAINER_NAME NODE_NAME HOST_DIRECTORY REMOTE_DIRECTORY)
    prompt_questions=(
        [IMAGE_NAME]='Image Name'
        [IP_ADDRESS]='IP Address'
        [PORT_ONE]='Port 1'
        [PORT_TWO]='Port 2'
        [CONTAINER_NAME]='Container Name'
        [NODE_NAME]='Node Name'
        [HOST_DIRECTORY]="Host Directory (Can leave this blank if you're building a new image)"
        [REMOTE_DIRECTORY]="Remote Directory (Can leave this blank if you're building a new image)"
    )
    cat <<EOF
Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank.
If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before

Enter details:
EOF
    for var in "${vars[@]}"; do
        read -rp "${prompt_questions[$var]}: " "$var"
    done
}

답변2

나는 현재 코드가 그렇게 나쁘지 않다고 생각합니다. 유일하게 반복되는 부분은 read -p단지 몇 글자에 불과하다는 것입니다. 어쨌든 변수 이름이나 힌트를 없앨 수는 없습니다.

(일부 사람들은 대화형으로 요청하는 스크립트보다 명령줄 인수를 선호할 수도 있지만 이는 선호의 문제입니다.)

어쨌든, 변수 이름의 이중 목록을 요구하는 @Jesse_b의 연관 배열이 별로 마음에 들지 않는다고 말했으므로 여기에 또 다른 옵션이 있습니다.

prompt_user() {
    queries=(
        IMAGE_NAME='Image Name'
        IP_ADDRESS='IP Address'
        PORT_ONE='Port 1'
        PORT_TWO='Port 2'
        CONTAINER_NAME='Container Name'
        NODE_NAME='Node Name'
        HOST_DIRECTORY="Host Directory (Can leave this blank if you're building a new image)"
        REMOTE_DIRECTORY="Remote Directory (Can leave this blank if you're building a new image)"
    )
    echo "Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank."
    echo "If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before"
    echo " "
    echo "Enter details:"
    for query in "${queries[@]}"; do
        read -rp "${query#*=}: " "${query%%=*}"
    done
}

"${query#*=}"첫 번째 등호에서 "${query%%=*}"문자열을 효과적으로 분할합니다 .query

관련 정보