本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第6回 引数を受け取って使ってみよう:$1・$2・$#の基本 | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第6回
はじめに
この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。
前回(第5回)では、シングルクォートとダブルクォートの違いを学びました。クォートの使い分けによって、変数が展開されるかどうかが変わることを確認しましたね。
さて、これまで学んできたスクリプトは、実行するたびに同じ結果を返すものでした。たとえば名前を変えたいときは、スクリプトの中身を書き直す必要がありました。しかし実際の場面では、毎回ファイルを開いて編集するのは手間がかかります。
第6回では、スクリプトを実行するときに外から値を渡せる「コマンドライン引数」を学びます。$1 や $2 を使えば、スクリプトの内容を変えることなく、実行のたびに異なる値を受け取ることができます。同じスクリプトをもっと柔軟に、もっと再利用しやすくするための一歩です。
この回で学ぶこと
- コマンドライン引数とは何か
$1と$2の意味$#で引数の数を確認する方法$@の基本- 引数ありでスクリプトを実行する方法
- 引数がない場合の表示
- 初学者が混同しやすい点
コマンドライン引数とは何か
スクリプト実行時に渡す値
コマンドライン引数は、スクリプトを実行するときに後ろへ書く値のことです。
たとえば、次のコマンドでは Taro と Tokyo が引数です。
sh args_sample.sh Taro Tokyoスクリプトの中では、1番目の引数を $1、2番目の引数を $2 のように使えます。
引数の数を確認する
引数の個数は $# で確認できます。
また、すべての引数をまとめて扱いたいときは $@ を使います。
サンプルコード
args_sample.sh に次の内容を保存します。
#!/bin/sh
echo "First: $1"
echo "Second: $2"
echo "Count: $#"
echo "All: $@"実行手順
1. ファイルを作成して保存する
エディタで args_sample.sh という名前のファイルを作成し、次の内容を保存します。
#!/bin/sh
echo "First: $1"
echo "Second: $2"
echo "Count: $#"
echo "All: $@"2. 引数ありで実行する
次のコマンドを実行します。
sh args_sample.sh Taro Tokyo実行結果は次のようになります。
First: Taro
Second: Tokyo
Count: 2
All: Taro Tokyo3. 引数なしで実行する
次に、引数を付けずに実行します。
sh args_sample.sh実行結果は次のようになります。
First:
Second:
Count: 0
All:コードの読み方
$1
$1 は、1番目の引数を表します。
sh args_sample.sh Taro Tokyo の場合、$1 は Taro です。
$2
$2 は、2番目の引数を表します。
この例では Tokyo です。
$#
$# は、渡された引数の数を表します。
引数が2個なら 2、引数がなければ 0 になります。
$@
$@ は、渡されたすべての引数をまとめて表します。
複数の引数をそのまま確認したいときに便利です。
引数を使う意味
これまでのスクリプトでは、表示する値をスクリプトの中に直接書いていました。たとえば名前を変えたいときは、ファイルを開いて該当箇所を書き直す必要がありました。小さなスクリプトであれば大した手間ではありませんが、何度も使い回すスクリプトでは、書き換えのたびにミスが起きるリスクもあります。
引数を使うと、この問題を解決できます。スクリプトの中身はそのままに、実行時に外から値を渡せるため、同じファイルを何度でも違う値で動かせます。
たとえば、名前と都市名を受け取るスクリプトであれば、Taro と Tokyo を渡した日もあれば、Hanako と Osaka を渡す日もある、という使い方ができます。スクリプトは一度書けばそのまま、渡す値だけを変えればいいのです。
これは、作業を自動化していく上でとても重要な考え方です。「処理の手順」と「処理に使う値」を切り離すことで、スクリプトの使い勝手が大きく広がります。
初学者がつまずきやすい点
$1 と変数の違いが混ざる
$1 は実行時に渡した1番目の引数です。
name="Taro" のような変数とは役割が異なります。
引数を書かずに実行してしまう
引数を渡さずに実行すると、$1 や $2 は空になります。
そのため、表示結果も空になることがあります。
引数の順番を間違える
1番目の引数が $1、2番目の引数が $2 です。
順番が変わると、表示される内容も変わります。
よくあるエラー
思った値が表示されない
引数の順番を確認してください。
sh args_sample.sh Taro Tokyoでは、Taro が $1、Tokyo が $2 です。
引数が空になる
引数を付けずに実行している可能性があります。
sh args_sample.shでは、$1 も $2 も空です。
引数の数が分からない
$# を表示すると確認できます。
echo "Count: $#"練習用コード
次の内容で profile_args.sh を作成して実行してみてください。
#!/bin/sh
echo "Name: $1"
echo "Age: $2"
echo "Argument count: $#"
echo "All arguments: $@"次のように実行して、結果を確認します。
sh profile_args.sh Yamada 20そのあと、引数を1個だけにした場合や、引数なしの場合も試してください。
この回で理解しておくこと
- コマンドライン引数はスクリプト実行時に渡す値である
$1は1番目、$2は2番目の引数を表す$#で引数の個数を確認できる$@で引数全体をまとめて扱える- 引数を使うと、同じスクリプトを別の値で再利用しやすい
- 引数がないときは対応する値が空になる
まとめ
今回は、$1、$2、$#、$@ を使って、スクリプトへ渡した引数を扱う方法を確認しました。
引数を使うと、スクリプトを毎回書き換えなくても、実行時に値を変えられます。
次回は、標準入力を read で受け取る方法を学びます。
次回予告
次回は「標準入力を read で受け取ろう」です。
キーボードから入力した値を受け取り、変数へ入れて使う方法を確認します。





