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


13

この単純な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?

6
print_somethingを呼び出すときに$ 1を忘れたためです。タイトルではなく質問にテキストを含めるようにしてください。
ルイFリベイロ

ありがとう。スクリプトにコマンドを挿入する必要がある場合、echo引数は次のようになります。print_something "$ 1"; print_something "$ 2"; そして多分もっと?
ピエトロ・レッティ

13
HNQでこれを見たとき、私はあなたがドル札を印刷していると思い、偽のお金を印刷していることをプリンターがどのように検出するかについてのジューシーな物語を読みたいと思った。
パイプ

@pipe私は以前にそれを経験しましたが、何らかの理由で、印刷防止機能を備えたものだけでなく、何も印刷しません。
-Codingale

回答:


41

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

print_something Something

実際に印刷しますSomething

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

print_something "$1"

最初の引数を渡す、または

print_something "$@"

例の関数は最初の関数のみを使用しますが、すべてを渡すために。


1
に渡す"$@"print_something、現在記述されているとおり、まだ最初の引数のみが出力されます。
クサラナナンダ

13
しかし、ポイントは、すべての引数を渡す方法を示すことだったと思います。関数は、現状では最初の引数のみを使用しているという事実は少し無関係です。
変人

最初の引数のみが使用されている場合、すべての引数を渡すことに意味がないと考えるだけです。
クサラナナンダ

14
@allo No. "$*"は単一の文字列(の最初の文字に結合$IFS)であり"$@"、個別に引用された要素のリストです。
クサラナナンダ

5
@Kusalanandaは、コマンドラインパラメーターを使用する関数に渡したい人に伝えるポイント"$@"です。この場合、そのようなパラメーターが1つしかない場合でも、そのようなすべてのケースをカバーします。OPが2番目のパラメーターを追加することを決定した場合、関数呼び出しで変更するものはありません。そして、これを読む他の誰もが、それを後でやり直す必要を避けるためにそれを行う正しい方法を学びます。
モンティハーダー

10

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

print_something "$1"

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


あなたが話していることをより明確にする必要があります。呼び出し元$1は一般的に関数とは異なりますが$1、上記で提案したように使用すると同じになる可能性があります。正しくecho言えecho $1ば、関数が単一のパラメーターで呼び出されたときに同じ()のままにすることができます(print_something $2呼び出し元の$ 1を取り$1、関数内で「作成」します)
-RudiC

6
使用することecho $1$1、展開するファイルパターンの$ IFS区切りリストとして扱われる場合を除き、意味がありません。echo "$1"内容を出力しないだろうが、より理にかなって$1の値のため$1のように-nene-EE...
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.