Linuxでシェルスクリプトを書くときに登場する「$0」「$1」「$2」などの記号。初めて見ると「何これ?」と戸惑ってしまうかもしれませんが、これはスクリプトの引数を表す特殊な変数です。
スクリプトを汎用的に動かすためには、こうした引数の扱い方を理解しておくことがとても大切です。この記事では、Linuxスクリプトにおける引数の基本的な考え方から、「$0」「$1」「$2」の具体的な使い方、そして複数の引数を扱う応用テクニックまで、初心者の方にもわかりやすく解説します。
$0
は、**実行されたスクリプトのファイル名(もしくはコマンド名)**を示します。
#!/bin/bash
echo "このスクリプトの名前は:$0"
このスクリプトを test.sh
という名前で保存し、以下のように実行したとします。
bash test.sh
すると、次のような出力が得られます:
このスクリプトの名前は:test.sh
さらに、次のように絶対パスで実行した場合:
/home/user/scripts/test.sh
出力は以下のようになります:
このスクリプトの名前は:/home/user/scripts/test.sh
このように、$0
はスクリプトをどう実行したかによって値が変わります。ログ出力やエラー表示などで、「このスクリプト内で何が起きたか」を伝える時に非常に便利です。
次に登場するのが、$1
, $2
, $3
といった引数用の変数です。これらは、スクリプトに渡された引数を順番に参照するために使われます。
#!/bin/bash
echo "1番目の引数:$1"
echo "2番目の引数:$2"
このスクリプトを args.sh
として保存し、次のように実行します:
bash args.sh Hello World
すると出力は以下のようになります:
1番目の引数:Hello
2番目の引数:World
このように、コマンドラインで渡した引数は、順番に $1
, $2
, $3
… としてスクリプトの中で扱えます。
スクリプトに渡された引数の個数を知りたい場合は、$#
を使います。
#!/bin/bash
echo "渡された引数の数は:$#"
例えば、以下のように実行した場合:
bash count.sh arg1 arg2 arg3
出力は:
渡された引数の数は:3
この変数を利用すれば、「引数が足りない場合のエラーチェック」なども実装できます。
$*
と$@
は、渡されたすべての引数をまとめて扱いたいときに使用します。ただし、この2つには微妙な違いがあります。
#!/bin/bash
for arg in "$*"; do
echo "引数:$arg"
done
このスクリプトを次のように実行します:
bash allargs.sh one two "three four"
出力:
引数:one two three four
#!/bin/bash
for arg in "$@"; do
echo "引数:$arg"
done
同じく実行すると:
引数:one
引数:two
引数:three four
このように、"$@"
は各引数を個別に扱うのに対して、"$*"
はすべてを一つの文字列としてまとめて扱う点が異なります。
スクリプトを実行する際に、必要な引数が渡されていない場合には、ユーザーに分かりやすく伝える処理を入れることも可能です。
#!/bin/bash
if [ $# -lt 2 ]; then
echo "使い方:$0 引数1 引数2"
exit 1
fi
echo "引数1:$1"
echo "引数2:$2"
このようにすることで、引数の不足をチェックし、安全にスクリプトを運用することができます。
簡単な実用例として、「第1引数を第2引数にコピーする」スクリプトを作ってみましょう。
#!/bin/bash
if [ $# -ne 2 ]; then
echo "使い方:$0 コピー元ファイル コピー先ファイル"
exit 1
fi
cp "$1" "$2"
echo "$1 を $2 にコピーしました"
実行方法:
bash copy.sh file.txt backup.txt
このように、引数を使えばスクリプトを柔軟に扱えるようになります。
Linuxスクリプトの世界では、引数を使いこなすことで再利用性が高く、柔軟で安全なコードを書くことができます。
$0
はスクリプトの名前$1
, $2
, …は実際の引数$#
は引数の数$*
と$@
はすべての引数を一括処理するために使えるこの基本を押さえるだけでも、あなたのスクリプト作成能力はぐっと向上します。もし今後、スクリプトの実行ログを整えたり、複雑な処理を自動化したりする場面があれば、ぜひここで紹介した内容を活かしてみてください。