web-dev-qa-db-ja.com

Bashスクリプトに渡されたすべての引数を私の関数に渡る方法は?

スクリプトに渡された引数の分析に関連するロジックを処理するfunction abc()を定義したとしましょう。

Bashスクリプトが受け取ったすべての引数をどのように受け渡しできますか? paramsの数は可変なので、このように渡された引数をハードコーディングすることはできません。

abc $1 $2 $3 $4

編集 。さらに良いことに、私の関数がスクリプト引数の変数にアクセスする方法はありますか?

481

$@変数は、スペースで区切られたすべてのコマンドラインパラメーターに展開されます。以下に例を示します。

abc "$@"

$@を使用するときは、スペースを含む引数の誤解析を避けるために、(ほぼ)常に二重引用符で囲む必要があります。これは複数の引数に対して機能します。 $*は1つの長い文字列として渡されます。

$0$@にないことも何の価値もありません。

Bash Reference Manual Special Parameters Section は、@が1から始まるpositiaonlパラメーターに展開されることを示しています。二重引用符内で展開すると、各パラメーターが個別のWordに展開されます。つまり、"$@""$1" "$2" "$3"...と同等です。

最初を除くすべて引数を渡す場合、最初にshiftを使用して最初の引数を「消費」し、次に$@を渡して残りの引数を別のコマンドに渡します。 。 bash(プレーンなPOSIXシェルではない)では、配列スライスのバリアントを使用して引数リストをいじることなくこれを行うことができます。"${@:3}"は、"$3"で始まる引数を取得します。 "${@:3:4}"は、"$3"(つまり、"$3" "$4" "$5" "$6")から始まる最大4つの引数を取得します(その数の引数が渡された場合)。

842
Gordon Davisson

これにはバリエーションが必要でしたが、他の人に役立つことを期待しています。

function diffs() {
        diff "${@:3}" <(sort "$1") <(sort "$2")
}

"${@:3}"部分は、3から始まる配列のすべてのメンバーを意味します。したがって、この関数は、最初の2つの引数をsortに渡し、次に他のすべての引数をdiffに渡すことによって、ソートされたdiffを実装します。

diffs file1 file2 [other diff args, e.g. -y]
132
hajamie

$@変数を使用します。これは、スペースで区切られたすべてのコマンドラインパラメータに展開されます。

abc "$@"
49
Mia Clarke

これが簡単なスクリプトです。

#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}

$#は、スクリプトが受け取る引数の数です。 args=("$@")行はすべての引数をargs配列に入れます。それらにアクセスするには${args[index]}を使います。

42

この構文で引数の範囲を指定できることを言及する価値があります。

function example() {
    echo "line1 ${@:1:1}"; #First argument
    echo "line2 ${@:2:1}"; #Second argument
    echo "line3 ${@:3}"; #Third argument onwards
}

私はそれが言及したのを見たことがなかった。

32
robstarbuck
abc "$@"

$@はbashスクリプトに与えられたすべてのパラメータを表します。

15
Vivien Barousse

abc "$ @"は一般的に正しい答えです。しかし、私はパラメータをsuコマンドに渡すことを試みていました、そして、引用符の量がエラーsu: unrecognized option '--myoption'を止めることができなかった。私にとって実際に機能したのは、すべての引数を単一の文字列として渡すことでした。

abc "$*"

私の正確なケース(私は他の誰かがこれを必要としていると確信しています)は私の.bashrcにありました

# run all aws commands as Jenkins user
aws ()
{
    Sudo su jenkins -c "aws $*"
}
5
andrew lorien