sys.argv
コマンドラインで Python スクリプトが呼び出されたすべての引数を含むリストであり、スクリプト自体は「引数 0」と見なされます。
これは、たまたまリストを含む他の変数と同じ、通常の変数です。したがって、 と の間sys.argv
に「選択」はありません*arg
。*arg
複数の引数として呼び出しに渡すリスト (またはその他のシーケンス) をアンパックするために使用される構文です。sys.argv
リストを含む他の変数と同様に、を渡すときにこの構文を使用できます。*
または、 を省略して、リスト全体を 1 つの引数として渡すこともできます。繰り返しますが、リストがたまたまそうであったかどうかは、sys.argv
何が起こったかとは無関係です。
あなたの混乱の原因は、Pythonスクリプトを呼び出しているシェルが、Pythonと同じように複数の引数が分離されているとは見なしていないことだと思います。Python では、複数の引数をコンマで区切るため、'hello','salut','hola'
3 つの引数になります (ただし、コンマの後にスペースを入れるのがより一般的なスタイルです)。
ほとんどのシェルOTOHでは、引数は空白で区切られています。'hello','salut','hola'
には空白が含まれていないため、1 つの引数にすぎません。そのため、Python リストにsys.argv
1 つの項目として表示されます。複数の引数を 1 つに連結する魔法は何も起こりません。議論が1つしかなかったというだけです。Python レベルsys.argv
で 3 つの項目を取得する方法は、次のようにスクリプトを呼び出すことです。
python trial.py 'hello' 'salut' 'hola'
また、Python の場合と同様に、シェル コマンド ラインで引用符を使用しているようにも見えます。ほとんどのシェルでは、すべてが文字列であるため、常に文字列を引用符で囲む必要はありません。代わりに、引用符は、空白を含む文字列が実際には複数の引数ではなく空白を含む 1 つの引数であることをシェルに伝えるため、またはシェルがデフォルトでどこでも行う特定の特別な処理を無効にするために使用されます。
Python では'hello'
、文字列を「hello」にする必要があるため、Python はそれを変数として読み取ろうとしませんhello
。しかし、シェルでは、'hello'
とhello
はどちらも同じで、単に文字列「hello」を意味します。he'll'o
ただし、文字列の一部のみを引用して記述することもできます。これは、シェルが引用符内の空白やその他の特殊文字を処理する方法を変更するだけですが、結果は同じ文字列「hello」になります。'hello','salut','hola'
これが、シェルがフォームを文字列 "hello,salut,hola" として解釈する理由です。引用符の外側に空白がないため、3 つの単語は個別の引数として扱われず、シェルに特殊文字の処理方法を指示するジョブを実行した後、引用符は消えます。