사용자에게 일부 데이터를 묻는 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}
중복된다는 인상을 받았습니다.