関数内の $1 がスクリプトの最初の引数を印刷しないのはなぜですか?

関数内の $1 がスクリプトの最初の引数を印刷しないのはなぜですか?

この単純な bash スクリプトでは なぜecho $1印刷されないのでしょうか?$1

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

答え1

位置パラメータはスクリプトのメインレベルのスクリプトの引数を参照しますが、関数の引数関数本体で。つまり

print_something Something

実際には が印刷されますSomething

スクリプトの引数を関数に渡す場合は、明示的に行う必要があります。

print_something "$1"

最初の引数を渡すか、

print_something "$@"

すべてを渡す必要がありますが、例の関数は最初のものだけを使用します。

答え2

これは、呼び出された関数が、親/呼び出し元のセットとは独立した独自の位置パラメータセットを取得するためです。

print_something "$1"

(そしてecho "$1"、あるいはさらに良いことにprintf '%s\n' "$1"、パラメータ展開を引用符で囲むことを忘れないでください。これはecho任意のデータには使用できません)。

関連情報