从函数中获取具体结果

从函数中获取具体结果

有没有办法在回显函数中返回特定值?

return允许我返回该函数的退出状态。我需要返回更复杂的数据结构,例如数组或字符串。通常我需要回显我想要返回的值。但是,如果我需要在函数中回显信息性消息,并且只需要获取包含我需要的结果的最后一个回显,该怎么办?

我有这段代码,我想用它来创建一个函数,但我想保留信息丰富的回显,因为它们对于指导用户的输入很有用。

modules=(module1 module2 module3)
is_valid=-1
while [ $is_valid -lt 1 ] 
do
    echo "Please chose and order the available modules you need:"
    echo -e $(list_array_choices modules[@])
    echo -n "> "
    read usr_input
    choices=("$usr_input")
    is_valid=$(is_list_in_range choices[@] ${#modules[@]})
    [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
done

我想做类似的事情

function get_usr_choices() {
    modules=${!1}
    is_valid=-1
    while [ $is_valid -lt 1 ] 
    do
        echo "Please chose and order the available modules you need:"
        echo -e $(list_array_choices modules[@])
        echo -n "> "
        read usr_input
        choices=("$usr_input")
        is_valid=$(is_list_in_range choices[@] ${#modules[@]})
        [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
    done
    echo ${choices[@]}  # This is the result I need.
}
choices=$(get_usr_choices modules[@])

唉,当我得到一个包含所有回声(包括信息丰富的回声)的字符串时,回声完全搞乱了输出。有没有办法以干净的方式做我想要的事情?

答案1

您可以将所有其他内容直接输出到屏幕,假设您除了显示之外不想对其执行任何操作。

可以做类似的事情

#!/bin/bash

function get_usr_choices() {
        #put everything you only want sending to screen in this block
        {
                echo these
                echo will
                echo go
                echo to
                echo screen
        }> /dev/tty
        #Everything after the block is sent to stdout which will be picked up by the assignment below
        echo result
}
choices=$(get_usr_choices)

echo "<choices is $choices>"

运行此返回

these
will
go
to
screen
<choices is result>

答案2

默认情况下,变量在 bash 中不是本地的,所以你可以这样做:

function get_usr_choices() {
    modules=${!1}
    is_valid=-1
    while [ $is_valid -lt 1 ] 
    do
        echo "Please chose and order the available modules you need:"
        echo -e $(list_array_choices modules[@])
        echo -n "> "
        read usr_input
        choices=("$usr_input")
        is_valid=$(is_list_in_range choices[@] ${#modules[@]})
        [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
    done
}

get_usr_choices
# use choices here

唯一的问题是不要使用或 管道get_usr_choices来调用子 shell ,否则你会丢失.$(...)choices

相关内容