支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

LinuxやUNIX系OSのシェルである「bash」について「シェルとは何か」という基本的な解説からbashのfor文の例文をいくつかご紹介いたします。

シェルとは

OSに搭載されているソフトウェアの1つで、ユーザーの入力や操作を受け付けてカーネルにその情報を引き渡し、そのまた逆も行う両者の仲介役のような働きを行っています。

シェルスクリプトとは

その名の通り、シェル上で実行が可能なプログラム言語(スクリプト言語とも)やそれらで構成されたコマンドなどで組み合わせられている簡易的なプログラムのことを指します。一般的にはUNIX系OSのシェルで実行できるものを指します。

bashとは

正式には「Bourne Again Shell」と呼びます。先程も述べましたが「bash」はLinuxやUNIX系のOSに使われる「シェル」になります。
bashは基本的なシェルである「sh」もとにして開発された、言うなれば強化型「sh」シェルになります。

bashの機能と使い方

補完処理

基本的な機能としては[補完]機能があります。どういった機能かというとコマンドプロンプトにて【Tabキー】を押すことで自動的にコマンド名やファイル名を補完してくれます。以下に例を記載します。

<例:「a」の補完>
$ ls
abc1 abc2 def
$ cat a[Tabキー]
$ cat abc

「a」にTabキーを使うことで「abc1」と「abc2」の共通している「abc」部分の「bc」が補完されます。この確定部分の補完処理が行われた状態でさらに「Tabキー」を2回押すとさらに候補を表示することが出来ます。
(例:「a」補完後さらにTabキー2回で候補の表示)
$ cat abc[Tabキー][Tabキー]
abc1 abc2

リダイレクト機能・パイプ機能

Linux系OSのプロセスは基本的な入出力先として「標準入力」「標準出力」「標準エラー出力」の3種類を持ち合わせています。通常、これらは使用している端末に関連づけられており、出力するプログラムを標準出力でリダイレクトしないまま実行すると端末上に実行結果がそのまま表示されます。
しかし、リダイレクトを行うことで標準入出力の指定を端末からファイルに変更することが可能になります

【文法】
[>file]:標準入力先をfileへ変更します。
[> file]:標準出力先をfileへ変更します。fileがすでに存在していた場合は上書きされます。
[>> file]:標準出力先をfileへ変更します。fileがすでに存在していた場合は追加されます。

さらに標準出力は他の標準入力へ繋げることが出来ます。これを[パイプ]機能と呼び、各コマンドを「|」でつなげて使用します。このリダイレクトとパイプ機能を使いこなすことで簡単に高度な処理を実行することが可能になります。

オプション

bashの主なオプションについていくつかご紹介します。

[bash -e]あるいは[set -e]:実行されたコマンドのうち1つが0でないステータスで終了した場合、そのままスクリプトを終了させ、その後エラーシェルスクリプトを実行した際にそれらの実行内容を表示します。
[bash -n]または[set -n]:スクリプト自体は実行せず、文法のチェックを行います。問題がある場合はエラーが出力され、問題ない場合は何も出力は行われません。
[bash -u]または[set -u]:定義されていない変数が参照された際に処理を終了します。(※[-][+]にするとオプション処理を逆の意味にして行います。)
[bash -o pipefail]または[set -o pipefail]:パイプで繋いた各コマンド上で終了ステータスが0以外(正常終了以外)だった場合、正常終了しなかった最後のコマンド終了ステータスが出力されます。
[bash -v]または[set -v]:シェルスクリプト内でこれから実行予定のコマンドを表示します。ただし出力されるのはスクリプト内に記述されているコマンドなので、実際に使用する場合は後述する[-x]オプションと同時に指定し、実行する内容と実行された内容を表示させるために使用することが多いです。
[bash -x]または[set -x]:デバッグ情報を出力します。具体的にはシェルスクリプト実行時に、実行されたコマンドや変数への代入などの「シェルスクリプト内で処理された内容」を出力します。

シェル変数と環境変数

シェルは「変数」を持つことも可能で、これを「シェル変数」と呼びます。現在保持している変数の一覧を表示したい場合、「set」コマンドを使用します。また、変数には「環境変数」という種類もあり、「現在実行しているシェル上でのみ有効な変数」を「シェル変数」と指すのに対して「新たなシェルを起動したりコマンドを実行した場合でも継続的に有効な変数」を「環境変数」と呼びます。大きな違いとしては変数の有効範囲が異なる点です。
シェル変数:シェルのプロンプト文字列を設定する。他のプロセスが参照する必要性がない。(代表例:PS1)
環境変数:ユーザーの使用言語を設定する。この値を見て処理を変えるプロセスがある。(代表例:LANG)

予約変数

環境変数のように追加せずともシェルに標準で定義されている変数があります。それを「予約変数」と呼びます。

[$$]:実行したシェルの自分のPID(プロセス番号)を格納します。
[$?]:最後に実行したコマンドの終了ステータスを格納します。(※コマンド成功時は「0」を、失敗時は「1」になります。ただしコマンドやエラーの種類によってはその他の数値もあります)
[$!]:最後に呼び出したバックグラウンドプロセスのプロセス番号を格納します。
[$-]:シェルに与えられたフラグを格納します。
[$1]:シェルスクリプトの実行時に指定された引数を格納します。
[$#]:シェルスクリプトの実行時に指定された引数か「set」コマンド実行時に指定された全パラメータが設定される変数を格納します。
[$0]:シェルスクリプト自身のファイル名フルパスを出力します。
[$n]:シェルスクリプトに与えられた引数を格納します。(※nには「1,2,3…」と指定することも可能です)
[$@]:シェルスクリプト実行時に指定された全引数が設定される変数を格納します。表示はデリミタを格納する環境変数「IFS」にセットされた値で区切られます。
[$*]:シェルスクリプト実行時に指定された全引数が設定される変数を格納します。(※出力はデリミタを格納する環境変数「IFS」の影響を受けません)
[${@:X:Y}]:複数のパラメータのうち、X番目以降のY個のデータを取得するための変数を格納します。
[!$]:最後に実行されたコマンドに指定していた引数を格納します。
[$PIPESTATUS]:パイプで連結した各コマンドの終了ステータスを設定します。
[$LINENO]:この変数を使用している行の行番号を設定します。

制御構造

bashは単純なコマンドや単語だけではなく「制御文」に対しても受付が可能です。制御文を用いて制御構造とすることで定型的な処理の手間を省き、非常に作業が楽になります。
制御文には様々な種類が存在しますが、基本的に対話的な環境で使用するには「for文」を使いこなすことが出来れば十分に効果を発揮できることでしょう。

<for文の基本書式>

$ for (変数名) in (リスト)
> do
>(コマンド)
> done
(以下コマンド結果)

for文の用途別例文

以下に「for文」を用いた様々な例文をご用意しました。

【[in]を用いて値を指定する】(基本書式)
$ for (変数) in (値のリスト); do
> #…
> done

①:値を直接指定する場合はinの後に利用したい値を入力します。その場合、入力する値は連続した値である必要はありません。(例:0 3 8 10;)

②:値の部分には変数を指定することも可能です。(例:for i in $foo $bar;)

③:範囲で値を指定する場合はカーリーブレイス({})で囲み、その中の最小値と最大値で設定することが可能です。(例:for i in {0..9}; do)加えて、inの後方でバッククォート(’’)$()を使ってseqコマンドを実行しても同様のことが実現できます。(例:for i in `seq 0 9`; do)(例:for i in $(seq 0 9); do)(※$()のほうがよく使用されています)

④:値は配列変数を指定することも可能です。
(例)
array=(0 1 2 3 4 5 6 7 8 9)
for i in ${array[@]};

最後に

いかがだったでしょうか。ここまでbashの基本的な説明とオプションやスクリプト、for文についての概要と基本的な使い方と例文をご紹介しました。ここでご紹介した例文以外にもfor文として様々な使い方が存在しますので、慣れるまでは上記の基本的な使い方で運用し、慣れてきたら他のfor文の使い方を試してみてはいかがでしょうか。少しでもこの記事がbashを使う上で役に立つことを祈っております。ここまで読んでくださってありがとうございました。