함수에서 특정 결과 얻기

함수에서 특정 결과 얻기

echo 함수에서 특정 값을 반환하는 방법이 있나요?

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서브쉘을 호출하기 위해 파이프를 사용하거나 파이프하지 않는 것입니다. 그렇지 않으면 손실이 발생합니다.$(...)choices

관련 정보