我有一个 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}"
然后在第二次扩展期间正确执行。如果你尝试反其道而行之,则很难保证第一次展开的结果在第二次展开时保持不变。
我也有这样的印象:第一个eval
(之前)local VAR_NAME=${2}
是多余的。