我有以下情况:
我正在编写一个脚本,该脚本将从配置文件(如果存在且参数存在)读取其参数,或者要求用户输入所述参数(如果不存在)。
由于我正在为一些参数执行此操作,因此我认为编写一个函数是可行的方法。
然而,据我了解,该函数通过echo
ing 或将其分配给全局变量来返回结果值。我确实想在函数中回显屏幕,所以它必须是选项二。所以我尝试了这个:
# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
# If the value couldn't be read from the config file
if [ -z "$3" ]; then
# Echo the prompt
echo "$2"
# Read the user input
read parameter
# If it's empty, fail
if [ -z "$parameter" ]; then
echo "Parameter $1 not found"
exit
# Else, try to assign it to $3 <---- This is where it fails
else
$3="$parameter"
fi
fi
}
我这样称呼它:
getParameter "Database username" "Please enter database username" $database_username
该config.cfg
文件是source
在调用函数之前创建的,并且$database_username
是那里的可选参数之一。
现在这显然行不通了。我无法分配给$3
并且因为我希望该方法是通用的,所以我MY_VARIABLE=$parameter
也不能这样做。
有谁对我如何实现以下所有目标有任何建议:
- 从其中获取变量值
config.cfg
或从用户输入中读取它 - 以通用方式执行此操作,即不要为每个参数重复上述代码(没有函数)
答案1
不能 100% 确定我遵循,但假设文件config
如下所示:
foo
database_user tom
bar
我们想要的明显值是 的值database_user
。
在脚本中,您可以简单地添加这样一行:
dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)
然后变量$dbUser
将包含以下信息:
echo $dbUser
tom
答案2
好吧,看来我解决了我自己的问题:
function getParameter {
if [ -z "$3" ]; then
# User read -p to show a prompt rather than using echo for this
read -p "$2`echo $'\n> '`" parameter
# Print to sdterr and return 1 to indicate failure
if [ -z "$parameter" ]; then
>&2 echo "Parameter $1 not found"
return 1
else
echo $parameter
fi
else
echo $3
fi
}
通过使用,echo -p
我能够在控制台上显示提示,并且仍然能够使用常规echo
.这样,通过调用该函数,database_username=$(getParameter ...)
我可以将其分配给一个变量。