第6回 引数を受け取って使ってみよう:$1・$2・$#の基本 | はじめてのシェルスクリプト

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第6回 引数を受け取って使ってみよう:$1・$2・$#の基本 | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第6回

目次

はじめに

この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。

前回(第5回)では、シングルクォートとダブルクォートの違いを学びました。クォートの使い分けによって、変数が展開されるかどうかが変わることを確認しましたね。

さて、これまで学んできたスクリプトは、実行するたびに同じ結果を返すものでした。たとえば名前を変えたいときは、スクリプトの中身を書き直す必要がありました。しかし実際の場面では、毎回ファイルを開いて編集するのは手間がかかります。

第6回では、スクリプトを実行するときに外から値を渡せる「コマンドライン引数」を学びます。$1$2 を使えば、スクリプトの内容を変えることなく、実行のたびに異なる値を受け取ることができます。同じスクリプトをもっと柔軟に、もっと再利用しやすくするための一歩です。

この回で学ぶこと

  • コマンドライン引数とは何か
  • $1$2 の意味
  • $# で引数の数を確認する方法
  • $@ の基本
  • 引数ありでスクリプトを実行する方法
  • 引数がない場合の表示
  • 初学者が混同しやすい点

コマンドライン引数とは何か

スクリプト実行時に渡す値

コマンドライン引数は、スクリプトを実行するときに後ろへ書く値のことです。

たとえば、次のコマンドでは TaroTokyo が引数です。

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 Tokyo

3. 引数なしで実行する

次に、引数を付けずに実行します。

sh args_sample.sh

実行結果は次のようになります。

First:
Second:
Count: 0
All:

コードの読み方

$1

$1 は、1番目の引数を表します。

sh args_sample.sh Taro Tokyo の場合、$1Taro です。

$2

$2 は、2番目の引数を表します。

この例では Tokyo です。

$#

$# は、渡された引数の数を表します。

引数が2個なら 2、引数がなければ 0 になります。

$@

$@ は、渡されたすべての引数をまとめて表します。

複数の引数をそのまま確認したいときに便利です。

引数を使う意味

これまでのスクリプトでは、表示する値をスクリプトの中に直接書いていました。たとえば名前を変えたいときは、ファイルを開いて該当箇所を書き直す必要がありました。小さなスクリプトであれば大した手間ではありませんが、何度も使い回すスクリプトでは、書き換えのたびにミスが起きるリスクもあります。

引数を使うと、この問題を解決できます。スクリプトの中身はそのままに、実行時に外から値を渡せるため、同じファイルを何度でも違う値で動かせます。

たとえば、名前と都市名を受け取るスクリプトであれば、TaroTokyo を渡した日もあれば、HanakoOsaka を渡す日もある、という使い方ができます。スクリプトは一度書けばそのまま、渡す値だけを変えればいいのです。

これは、作業を自動化していく上でとても重要な考え方です。「処理の手順」と「処理に使う値」を切り離すことで、スクリプトの使い勝手が大きく広がります。

初学者がつまずきやすい点

$1 と変数の違いが混ざる

$1 は実行時に渡した1番目の引数です。

name="Taro" のような変数とは役割が異なります。

引数を書かずに実行してしまう

引数を渡さずに実行すると、$1$2 は空になります。

そのため、表示結果も空になることがあります。

引数の順番を間違える

1番目の引数が $1、2番目の引数が $2 です。

順番が変わると、表示される内容も変わります。

よくあるエラー

思った値が表示されない

引数の順番を確認してください。

sh args_sample.sh Taro Tokyo

では、Taro$1Tokyo$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 で受け取ろう」です。

キーボードから入力した値を受け取り、変数へ入れて使う方法を確認します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次