Shell 脚本交互函数

Shell 脚本交互函数

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

相关内容