関数から特定の結果を取得する

関数から特定の結果を取得する

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>

おすすめ記事