関数は入力として受け取っていない値をエコーすることができます

関数は入力として受け取っていない値をエコーすることができます

私は bash を初めて使います。この言語での関数の動作方法がわかりません。

私は次のコードを書きました:

#!/usr/bin/env sh

choice_func() {
        echo "$choice"
}

echo "Enter your choice:"
read choice
choice_func

コードを調べているときに、 を呼び出すときに の値をchoice入力として送信し忘れていることに気付きましたchoice_func()。しかし、正常に動作します。関数に入力が与えられていないのに、それが可能であるのはなぜでしょうかecho?

答え1

スクリプトのメイン部分で変数に値を読み込みますchoice。この変数はグローバル スコープ (適切な言葉が見つからないため) を持ちます。つまり、関数内でも表示されます。

関数内で値を読み取る場合、変数は依然としてグローバル スコープを持ち、関数の外部 (関数呼び出し後) で参照可能になることに注意してください。関数内でlocalとして宣言しない限り、このようになります。local choice

シェル変数のスコープの詳細については、例えば以下を参照してください。

変数の値をchoice関数に渡すには、

choice_func "$choice"

関数は$1最初の位置パラメータでこの値にアクセスできます。

choice_func () {
    echo "$1"
}

または

choice_func () {
   local choice="$1"

   # choice is now local and separate from the variable
   # with the same name in the main script.

   echo "$choice"
}

これは、関数に値を渡す適切な方法です。頼るシェル スクリプト内のグローバル変数について。

答え2

引数を必要としない関数を設計したので、それだけです。

関連情報