Shell 脚本新手...
我正在寻找一个交互式安装脚本。它会询问问题并要求用户做出选择,然后才能继续下一步。
我遇到的问题是如何保持代码整洁,并将代码隔离到每个步骤的特定函数,同时允许每个函数输出指示并要求用户进行选择。在同一个函数中,捕获他们的选择,然后从数组中提取数据并返回稍后在设置函数中使用的值。
这是我目前所拥有的,但我被困住了......
# Domains
DOMAINS=(
"domain.com"
"example.com"
)
function set_domain(){
echo ""
echo "Select a Domain:"
echo ""
echo "0. to exit."
echo "1. ALL DOMAINS"
for ((i=0; i<${#DOMAINS[*]}; i++));
do
if [[ $((i+2)) < "10" ]];
then
echo $((i+2))". "${DOMAINS[i]}
else
echo $((i+2))". "${DOMAINS[i]}
fi
done
echo ""
read -s -n1 DOMAIN
if [[ ${DOMAIN} == "0" ]]; then
exit
fi
if [[ ${DOMAIN} == "1" ]]; then
return DOMAINS
fi
return ${DOMAINS[DOMAIN-2]}
}
function do_setup(){
local DOMAIN=$(set_domain)
echo DOMAIN
}
do_setup
脚本似乎甚至没有触发该set_domain
函数。我如何创建一个函数来输出方向,要求用户进行选择,然后根据他们的选择,从主调用函数返回一个要存储在变量中的值?
基本上,我想要获取输出set_domain
并将其存储在do_setup
函数中的一个变量中,然后将其传递给另一个函数来使用该数据。
我究竟做错了什么?
答案1
Bash 中的函数具有与外部脚本相同的限制和行为。它们不能返回任意数据 –return
函数仅指定与exit
脚本相同类型的“退出代码”(范围从 0 到 127)。因此,您可以返回 0/1 并将其用于成功/失败检查或从 检索它$?
,但它不能用于任意数据。
操作$(...)
符不会捕获命令的“返回值”,而是捕获该命令的输出,即写入 stdout 的文本。您可以在此处使用它,但函数需要echo
其结果,而不是“返回”它。
testfunc() {
echo "Hello!"
}
var=$(testfunc)
echo "var = $var"
注意:实际上 bash有一个内置用于制作菜单提示,所以你并不总是需要重新发明这一部分:
PS3="Your choice: "
select DOMAIN in "${DOMAINS[@]}"; do
if [[ $DOMAIN ]]; then
echo "You entered '$REPLY' and selected '$DOMAIN'."
break
else
echo "Error: Invalid choice '$REPLY'"
fi
done