Categories: linux

Linuxシェルスクリプトで使う「$@」の意味と使い方を徹底解説!

Linuxのシェルスクリプトで「$@」という記述を見たことがあるけれど、実際にどう使うのかよくわからないという方も多いのではないでしょうか。
この「$@」は、スクリプトや関数に渡されたすべての引数を展開するための特別な変数です。
正しく使えば、スクリプトの柔軟性がぐっと上がり、より実践的なコードが書けるようになります。

この記事では、$@の基本的な意味から、使い方、違いの出やすい類似表現との比較、実践的な使用例まで、詳しく解説していきます。
Linux初心者やシェルスクリプトに挑戦したい方は、ぜひ最後まで読んで理解を深めてください。


「$@」とは何か?基本の意味を解説

「$@」は、シェルスクリプトや関数に渡された「すべての引数」を、それぞれ独立した形で展開する特別な変数です。
たとえば、以下のようなスクリプトを実行したとき:

./myscript.sh arg1 arg2 arg3

スクリプト内で $@ を使うと、arg1arg2arg3 の3つの引数がそれぞれ個別に扱われることになります。

ポイントは、「それぞれが“独立した引数”として展開される」こと。
つまり、引数にスペースを含んでいたとしても、正しく1つのまとまりとして扱われます(クォーテーションで囲んだ場合)。


「$*」との違いに注意しよう

よく似た変数に「$*」がありますが、これは使い方によって意味が変わってきます。
以下に比較表を載せます。

表現意味(クォーテーションなし)意味(クォーテーションあり)
$@各引数を個別に展開各引数を個別に展開
$*各引数を個別に展開すべての引数を1つの文字列として展開

具体例で見てみましょう。

#!/bin/bash
for arg in "$@"
do
echo "引数: $arg"
done

上記スクリプトでは、各引数が1行ずつ出力されます。

$ ./myscript.sh "hello world" test
引数: hello world
引数: test

一方、"$*" に変えると:

#!/bin/bash
for arg in "$*"
do
echo "引数: $arg"
done
$ ./myscript.sh "hello world" test
引数: hello world test

このように1行で出力されてしまい、それぞれの引数が個別に処理されないため注意が必要です。


実際の使用例:引数をそのまま別コマンドに渡す

たとえば、スクリプトでlsコマンドに引数をそのまま渡したいとき、以下のように書けます。

#!/bin/bash
ls "$@"

このスクリプトを list.sh として保存し、以下のように実行すると:

./list.sh -l /etc

内部では ls -l /etc と同じように動作します。
「”$@”」を使うことで、ユーザーが渡したオプションやパスをそのまま受け渡すことが可能になるのです。


引数の数を取得するには「$#」

「$@」と併せて使いたいのが「$#」です。これは引数の個数を表します。

echo "引数は全部で$#個あります"

たとえば、以下のように使うと:

$ ./myscript.sh one two three
引数は全部で3個あります

このように、引数の個数を表示したり、条件分岐に使ったりするときに便利です。


ループ処理での活用例

「$@」はループと非常に相性がよいです。たとえば、引数で指定されたファイルをすべてコピーするスクリプトを書きたい場合:

#!/bin/bash
for file in "$@"
do
cp "$file" /backup/
echo "$file をバックアップしました"
done

これにより、複数のファイルを一度に指定して、まとめて処理することができます。

$ ./backup.sh file1.txt file2.txt file3.txt
file1.txt をバックアップしました
file2.txt をバックアップしました
file3.txt をバックアップしました

「$@」の応用:関数内での引数展開

関数を定義して、その中で「$@」を使うこともできます。

function greet_all() {
for name in "$@"
do
echo "こんにちは、$nameさん"
done
}

greet_all "田中" "佐藤" "鈴木"

実行結果:

こんにちは、田中さん
こんにちは、佐藤さん
こんにちは、鈴木さん

このように関数内でも「$@」を使えば、引数の個数に関係なく処理が可能になります。


トラブルを防ぐには「必ずクォーテーションをつける」

"$@" のように、必ずダブルクォーテーションを付けるのが基本です。
なぜなら、クォーテーションなしだと、引数にスペースが含まれていた場合に、誤って分割されてしまう可能性があるからです。

例えば:

$ ./myscript.sh "My Documents" /tmp

スクリプト内で $@ と書いていた場合:

for arg in $@

この場合、MyDocuments が別の引数として処理されてしまいます。
これを防ぐために、必ず "$@" と書くようにしましょう。


おわりに:$@はスクリプトの柔軟性を高める鍵

「$@」は、シェルスクリプトの中でも非常に基本的でありながら、応用範囲の広い機能です。
正しく使うことで、スクリプトに柔軟性を持たせ、実際の業務や作業で役立つ自動化が実現できます。

特に、複数のファイルを処理するループや、別コマンドへの引数の受け渡しなど、さまざまなシーンで活用可能です。
また、「$*」との違いや、クォーテーションの有無による挙動の違いにも注意することで、ミスの少ない堅牢なスクリプトを書くことができます。

これからスクリプトを学びたい方や、もっと実用的なコードを書きたい方にとって、「$@」の理解は非常に重要な第一歩となるでしょう。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。