第20回 位置パラメータをまとめて扱おう:$@・$#とforを組み合わせる方法 | はじめてのシェルスクリプト

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

System Note $ cat /proc/ai-disclosure

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

第20回 位置パラメータをまとめて扱おう:$@・$#とforを組み合わせる方法 | はじめてのシェルスクリプト

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

目次

はじめに

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

第6回では、スクリプト実行時に渡せる引数($1 $2)の基本を学びました。引数を使うことで、同じスクリプトをさまざまな入力で再利用できるようになりましたね。

しかし、引数の数があらかじめ決まっていない場合、$1 $2 $3 と順番に書いていくのは限界があります。引数が10個でも100個でも、まとめて処理したい場面が実際の作業ではよく出てきます。

第20回では、全引数を一括で扱える "$@" や、引数の個数を確認する $# の使い方、さらに for 文と組み合わせて引数を順番に処理する方法を学びます。これを身につけると、汎用性の高いスクリプトが書けるようになります。

この回で学ぶこと

  • 位置パラメータをまとめて扱う考え方
  • "$@" の意味
  • $# で件数を確認する方法
  • for と組み合わせる基本
  • set -- を使って値を入れ直す方法
  • 文字列の変数との違い
  • 初学者がつまずきやすい書き方

位置パラメータをまとめて扱うとは何か

複数の値を順番に処理する

シェルスクリプトでは、引数として受け取った複数の値を順番に処理したい場面があります。

そのときに使うのが位置パラメータです。

$1 $2 のように個別に取り出すだけでなく、"$@" を使うと全部を順番に扱えます。

文字列の変数との違い

たとえば、次の変数は文字列をひとつだけ持っています。

name="Taro"

一方で、位置パラメータは次のように複数の値を順番に持てます。

set -- "Taro" "Hanako" "Ken"

サンプルコード

params_sample.sh に次の内容を保存します。

#!/bin/sh

set -- "Taro" "Hanako" "Ken"

echo "1番目: $1"
echo "2番目: $2"
echo "件数: $#"

for name in "$@"
do
  echo "名前: $name"
done

実行手順

1. ファイルを作成して保存する

エディタで params_sample.sh という名前のファイルを作成し、次の内容を保存します。

#!/bin/sh

set -- "Taro" "Hanako" "Ken"

echo "1番目: $1"
echo "2番目: $2"
echo "件数: $#"

for name in "$@"
do
  echo "名前: $name"
done

2. スクリプトを実行する

次のコマンドを実行します。

sh params_sample.sh

実行結果の例です。

1番目: Taro
2番目: Hanako
件数: 3
名前: Taro
名前: Hanako
名前: Ken

コードの読み方

set — “Taro” “Hanako” “Ken”

位置パラメータに3つの値を入れています。

-- の後ろに並べた値が、$1 $2 $3 として扱われます。

$1

1番目の値を取り出しています。

位置パラメータは 1 番目から順番に参照します。

$#

位置パラメータの件数を確認しています。

この例では 3 が表示されます。

"$@"

位置パラメータのすべての値を順番に取り出しています。

for 文と組み合わせると、各引数に対して同じ処理を実行できます。

位置パラメータを使う場面

位置パラメータは、複数のファイル名、名前、対象一覧などを順番に処理したいときに使います。

値がひとつだけなら通常の変数で足りますが、複数の値を順番に処理したい場合は "$@" が便利です。

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

"$@" ではなく $@ と書いてしまう

複数の引数を安全に扱うときは "$@" の形を基本にします。

まずは引用符付きで覚えるのが安全です。

$#$1 を混同する

$1 は1番目の値です。

$# は件数です。

似ていますが役割はまったく違います。

set ---- を忘れる

位置パラメータを入れ直すときは set -- value1 value2 の形で書きます。

-- がないと意図した形で扱えないことがあります。

よくあるエラー

期待した回数だけ繰り返されない

for 文で "$@" を使っているか確認してください。

複数の値をまとめて扱うときは、この形が基本です。

件数が思った値にならない

set -- の後ろに何個の値を書いたか確認してください。

空白を含む値がある場合は引用符も確認します。

1番目や2番目の値が空になる

指定した件数より多い番号を読んでいないか確認してください。

たとえば、値が2つしかないのに $3 を読むと空になります。

練習用コード

次の内容で fruit_params.sh を作成して実行してみてください。

#!/bin/sh

set -- "apple" "banana" "orange"

echo "最初の値: $1"
echo "件数: $#"

for fruit in "$@"
do
  echo "fruit: $fruit"
done

値を追加したり順番を変えたりして、実行結果がどう変わるか確認してください。

この回で理解しておくこと

  • 位置パラメータは複数の値を順番に扱える
  • set -- を使うと値を入れ直せる
  • $1 のように順番で値を取り出せる
  • 件数は $# で確認できる
  • "$@" を使うとすべての値を順番に処理できる
  • for 文と組み合わせると各値を順番に処理できる

まとめ

今回は、位置パラメータを使って複数の値をまとめて扱う基本を確認しました。

"$@"$# を使えるようになると、複数の引数を扱うスクリプトを書きやすくなります。

次回は、関数と終了ステータスを組み合わせる方法を学びます。

次回予告

次回は「関数と終了ステータスを組み合わせよう」です。

関数の実行結果を成功と失敗で扱う基本を確認します。

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

この記事を書いた人

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

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

Created by UNIX Cafe

目次