Skip to main content
added 74 characters in body
Source Link
kaligne
  • 906
  • 4
  • 11
  • 29

Is there a way to return a specific value in an echoing function?

return allows me to return an exit status for the function. I need to return a more sophisticated data structure such as an array, or a string. Usually I would need to echo the value I want to be returned. But what if I need to echo informative messages in my function, and I only need to get the last echo which holds the result I need?

I have this chunk of code I would like to make a function out of it, but I would like to keep the informative echo as they are useful for guiding the user's input.

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

I would like to do something like

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[@])

Alas the echos completely mess up the output as I get a string containing all the echo, including the informative ones. Is there a way to do what I want a clean way?

Is there a way to return a specific value in an echoing function?

return allows me to return an exit status for the function. I need to return a more sophisticated data structure such as an array, or a string. Usually I would need to echo the value I want to be returned. But what if I need to echo informative messages in my function, and I only need to get the last echo which holds the result I need?

I have this chunk of code I would like to make a function out of it, but I would like to keep the informative echo as they are useful for guiding the user's input.

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

I would like to do something like

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[@])

Alas the echos completely mess up the output. Is there a way to do what I want a clean way?

Is there a way to return a specific value in an echoing function?

return allows me to return an exit status for the function. I need to return a more sophisticated data structure such as an array, or a string. Usually I would need to echo the value I want to be returned. But what if I need to echo informative messages in my function, and I only need to get the last echo which holds the result I need?

I have this chunk of code I would like to make a function out of it, but I would like to keep the informative echo as they are useful for guiding the user's input.

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

I would like to do something like

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[@])

Alas the echos completely mess up the output as I get a string containing all the echo, including the informative ones. Is there a way to do what I want a clean way?

Source Link
kaligne
  • 906
  • 4
  • 11
  • 29

Get specific result from function

Is there a way to return a specific value in an echoing function?

return allows me to return an exit status for the function. I need to return a more sophisticated data structure such as an array, or a string. Usually I would need to echo the value I want to be returned. But what if I need to echo informative messages in my function, and I only need to get the last echo which holds the result I need?

I have this chunk of code I would like to make a function out of it, but I would like to keep the informative echo as they are useful for guiding the user's input.

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

I would like to do something like

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[@])

Alas the echos completely mess up the output. Is there a way to do what I want a clean way?