Linuxのシェルスクリプトで「$@」という記述を見たことがあるけれど、実際にどう使うのかよくわからないという方も多いのではないでしょうか。
この「$@」は、スクリプトや関数に渡されたすべての引数を展開するための特別な変数です。
正しく使えば、スクリプトの柔軟性がぐっと上がり、より実践的なコードが書けるようになります。
この記事では、$@の基本的な意味から、使い方、違いの出やすい類似表現との比較、実践的な使用例まで、詳しく解説していきます。
Linux初心者やシェルスクリプトに挑戦したい方は、ぜひ最後まで読んで理解を深めてください。
「$@」は、シェルスクリプトや関数に渡された「すべての引数」を、それぞれ独立した形で展開する特別な変数です。
たとえば、以下のようなスクリプトを実行したとき:
./myscript.sh arg1 arg2 arg3
スクリプト内で $@
を使うと、arg1
、arg2
、arg3
の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 $@
この場合、My
と Documents
が別の引数として処理されてしまいます。
これを防ぐために、必ず "$@"
と書くようにしましょう。
「$@」は、シェルスクリプトの中でも非常に基本的でありながら、応用範囲の広い機能です。
正しく使うことで、スクリプトに柔軟性を持たせ、実際の業務や作業で役立つ自動化が実現できます。
特に、複数のファイルを処理するループや、別コマンドへの引数の受け渡しなど、さまざまなシーンで活用可能です。
また、「$*」との違いや、クォーテーションの有無による挙動の違いにも注意することで、ミスの少ない堅牢なスクリプトを書くことができます。
これからスクリプトを学びたい方や、もっと実用的なコードを書きたい方にとって、「$@」の理解は非常に重要な第一歩となるでしょう。