![사용자에게 문장을 요청하고 공백의 간섭 없이 저장합니다.](https://linux55.com/image/32815/%EC%82%AC%EC%9A%A9%EC%9E%90%EC%97%90%EA%B2%8C%20%EB%AC%B8%EC%9E%A5%EC%9D%84%20%EC%9A%94%EC%B2%AD%ED%95%98%EA%B3%A0%20%EA%B3%B5%EB%B0%B1%EC%9D%98%20%EA%B0%84%EC%84%AD%20%EC%97%86%EC%9D%B4%20%EC%A0%80%EC%9E%A5%ED%95%A9%EB%8B%88%EB%8B%A4..png)
사용자에게 일부 데이터를 묻는 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}
중복된다는 인상을 받았습니다.