사용자에게 문장을 요청하고 공백의 간섭 없이 저장합니다.

사용자에게 문장을 요청하고 공백의 간섭 없이 저장합니다.

사용자에게 일부 데이터를 묻는 bash 기능이 있습니다. 이름, 성, 생일 등을 검색해 보았습니다.

주로 한 문장으로 표현된 데이터입니다.

거리 + 번호를 물었을 때. 공백을 처리할 수 없기 때문에 함수가 중단됩니다.

askForData 'Please enter your street and number' STREET

다음 오류가 발생합니다.

Please enter your street and number: ExampleStreet 123
func_askForData: line 21: 123: command not found

문장을 받아들이도록 기능을 어떻게 확장할 수 있나요?

파일: func_askForData

#!/bin/bash

# Usage askForData "Prompt for value" VARIABLE
# Prints out prompt and stores input in VARIABLE
# 
# Prompt is printed till non-empty input is made.

function askForData()
{
local PROMPT=${1}
eval local VAR_NAME=${2}

local CONTINUE=true
while ${CONTINUE}
    do
        read -p "${PROMPT}: " VAR_VALUE
        if [ -z "$VAR_VALUE" ]; then
            CONTINUE=true
        else
            CONTINUE=false
            eval ${VAR_NAME}="${VAR_VALUE}"
        fi
    done
}

추가 정보

bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.

답변1

사용

eval ${VAR_NAME}='"${VAR_VALUE}"'

를 사용하면 eval일반적으로 확장이 두 배로 늘어납니다. 명령문에 한 번만 확장해야 하는 내용이 있는 경우 eval일반적으로 첫 번째 확장은 아무 작업도 수행하지 않고(따옴표 제거 제외) 두 번째 확장은 주요 작업을 수행하는 방식으로 이를 인용하는 것이 가장 좋습니다. 이 특정 예에서 첫 번째 확장은 다음을 산출합니다.

STREET="${VAR_VALUE}"

그러면 두 번째 확장 중에 올바르게 실행됩니다. 반대로 하려고 하면 1차 확장의 결과가 2차 확장에서도 그대로 유지된다는 보장이 어려울 것입니다.

나는 또한 첫 번째 eval(이전) 가 local VAR_NAME=${2}중복된다는 인상을 받았습니다.

관련 정보