関数の$ 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任意のデータと一緒に使用することはできません。)

関連情報