bashスクリプトの他のコマンドにパラメーターを転送するにはどうすればよいですか?


165

私のbashスクリプト内で、ゼロ、1つまたは2つのパラメーター(スクリプトはパラメーターを認識できる)を解析し、残りのパラメーターをスクリプトで呼び出されたコマンドに転送します。どうやってやるの?

回答:


239

shift組み込みコマンドを使用して引数を「食べる」。次に、子プロセスを呼び出し、それに"$@"引数を渡して、残りのすべての引数を含めます。引用符に注意してください。引数リストの展開が適切に引用されるため、引用符は保持する必要があります。


23
実際には "$ @"は$ *より安全です
pixelbeat 2009年

1
@pixelbeat:よろしくお願いいたします。編集しました。@ŁukaszLew:マニュアルのリンク先ページを参照してください。:)基本的に、それは引用をよりよく処理します。
アンワインド

22
$@基本的には、配列の各要素を引用符付きの文字列として扱います-それらは拡張の機会なしに渡されます。また、それぞれが個別の単語と見なされるようにします。この説明と、違いを示すテストスクリプトは次のとおり
Cascabel

2
引用符の使用に注意してください!:それは周りにここに重要である理由の詳細を読むstackoverflow.com/a/4824637/4575793
Cadoiz

32

bashは、shiftコマンドを使用します。

たとえば、shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3が生成する

1
2 3

2
@TamásZaholaは説明する気ですか?
カイルChadha

2
あなたに引数を転送する場合は$1、それらを引用することなく、"$1"例えばので、その後、シェルは、単語分割を行いますfoo barと転送されますfoobar、別途。
タマシュZahola

:二重の"ここの周りに持っていることが重要である理由についてもっと読むstackoverflow.com/a/4824637/4575793
Cadoiz

1
私の脳は "shifttest"でいくつかの文字を乱雑にし、その結果、私はそれを別のものとして読みました。
アレックス

21

Bashはサブセット化パラメーター(サブセットおよびサブストリングを参照)をサポートしているため、このように処理/渡すパラメーターを選択できます。

  1. 新しいファイルを開いて編集します:vim r.sh

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. それを実行します:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. 結果は次のとおりです。

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.