Linux講座にようこそ。このページは「Linuxの使い方 - 第6章 シェルスクリプトの作り方」です。

Linuxの使い方

6. シェルスクリプトの作り方(7/8)

6.8 関数(1/2)

少し大きめなシェルスクリプトになりますと、複数の機能を持っています。このようなものを1つのファイルとして作りますと、次のような不具合が考えられます。

  • 内容が整理されていないものになりがちで、可読性が悪くなる可能性が大きくなります。
  • 機能の変更や追加がしにくくなります。
  • 不良を作り込みやすく、不良があっても対策しにくくなります。

これらの対応策として、機能毎のモジュール(部品)化が考えられます。この部品がシェルスクリプトの場合は関数になります。

関数はシェルスクリプト中に記述することも出来ますし、関数だけを別のファイルに記述しておくことも出来ます。また、特別な使い方として、aliasコマンドで定義したコマンドは引数の指定が出来ませんが、関数の場合は出来ますので、aliasコマンドの拡張機能的に使うことも出来ます。

ここでは次の事項に付いて説明します。

6.8.1 変数の宣言と有効範囲

変数は必要なときに名前を指定してすぐに使うことが出来ますが、この場合のデータは文字データとして変数に格納されます。一方、変数は明示的に宣言してから使用することも出来ますが、この場合はいろいろな属性を与えることが出来ます。

変数の宣言はdeclareまたはtypesetコマンド、及びlocalコマンドで行います。declareコマンドには次のようなオプションがあります。

【表6-16】 declareコマンドのオプション一覧
オプション意味
-a変数を配列として作成します。
-i変数を整数型(integer)として作成します。
-r変数を参照のみ可能(read only)として作成します。
-f定義済関数を表示します。
-F定義済関数名を表示します。

配列は連続した変数領域で、同じ種類のデータを複数扱うときに使用します。つまり、1つの配列に複数のデータを格納できるということです。配列中の個々のデータを取り扱うときには何番目のデータなのかを指定します。この番号を添字と呼んでおり、0から始まる整数で指定します。

-iオプションを付けて整数型として宣言した変数は整数演算用として宣言したことになりますので、「$(( 式 ))」の形式でなくても「式」だけで演算が出来ます。ただし、演算子の前後に空白を入れてはいけません。また、値の参照のための$も省略可能です。さらに、代入する値も整数型とみなしますので、代入する変数が文字型の場合は整数型に変換されます。(例題2をご覧ください)

read onlyとした場合は後からその変数に値を設定することは出来ませんので、宣言時に値を与えておきます。また、read onlyの解除は「+r」オプションで再宣言を行えば可能です。

変数の有効範囲
【図6-2】
変数の有効範囲

変数には有効範囲があります。つまり、シェルスクリプト中のどこでも使えるもの(グローバル変数)と、関数内だけで使えるもの(ローカル変数)です。関数内でlocalコマンドで宣言しますとローカル変数になります。それ以外の変数はグローバル変数です。また、位置パラメータはローカル変数です。

図6-2で、(1)はシェルスクリプト内全体に有効(グローバル変数)を、(2)は関数の外側、(3)は関数内で有効(ローカル変数)を表しています。(1)に該当する変数はval00、val01、val03、val04で、(2)に該当する変数は$2で、(3)に該当する変数はval02と$1です。

形式

配列の宣言で、-i-rオプションの指定もできます。また、localコマンドで配列の宣言も出来ますし、-i-rオプションの指定もできます。

※ declareコマンド
declare -a 配列名
declare -a 配列名[要素数] ← データ格納数(要素数)を指定します。要素数は[]で括ります
declare -a 配列名=(値1 値2 … 値n) ← 初期値を指定します。値は空白で区切ります

declare -i 変数名
declare -i 変数名=値 ← 値は整数を指定します

declare -r 変数名=値 ← 初期値を指定します。後からの設定は出来ません

declare -f ← 定義してある関数全ての内容を表示します
declare -f 関数名 ← 指定した関数の内容のみ表示します
declare -F ← 関数名のみ表示します

※ 配列への値の設定
配列名[添字]=値 ← 添字は整数値で、先頭の要素は0です
配列名=(値1 値2 … 値n) ← 複数の値を設定できます

※ 配列の値の参照
${配列名[添字]} ← 添字で指定した要素の値のみを参照します
${配列名[*]} ← 全ての要素の値を参照します
${#配列名[添字]} ← 添字で指定した要素の文字数を参照します
${#配列名[*]} ← データ数を参照します

※ localコマンド(-a、-i、-rオプションの指定もできます)
local 変数名
local 変数名=値

例題

例題1

配列の使い方を示します。

$ declare -a array1 ← 配列の宣言です
$ array1[0]=merry ← 配列要素に値を設定します
$ array1[1]=ken
$ array1[2]=kuma
$ echo ${array1[1]} ← 2番目の要素の値を表示します
ken
$ echo ${array1[*]} ← 全ての要素の値を表示します
merry ken kuma
$ echo ${#array1[2]} ← 3番目の要素の文字数を表示します
4
$ echo ${#array1[*]} ← データが設定されている要素の数を表示します
3
$
例題2

整数型とRead only変数の使い方を示します。

$ declare -i v01=10 ← 整数型変数の宣言です
$ declare -i v02=20
$ declare -i ans
$
$ char=$(( $v01 + $v02 )) ← char変数は宣言無しのため文字型です
$ echo $char
30
$ char=$(( v01 + v02 )) ← 変数の値の参照のための$は省略可能です
$ echo $char
30
$ char=$v01+$v02 ← char変数は文字型のため「$v01+$v02」は文字列として代入されてしまいます
$ echo $char
10+20
$ ans=$v01+$v02 ← ans変数は整数型のため「$v01+$v02」は整数演算となります
$ echo $ans
30
$ ans=v01+v02 ← 変数の値の参照のための$は省略可能です
$ echo $ans
30
$
$ char="200" ← 文字型のchar変数に文字の200を代入します
$ ans=char+10 ← ans変数は整数型のため、char変数の値は整数型に変換されます
$ echo $ans
210
$
$ declare -r v03 ← Read only変数の宣言です
$ v03=merry
bash: v03: readonly variable ← 値の代入は出来ません
$
$ declare -r v04=ken ← 初期値として値を設定します
$ echo $v04
ken
$ v04=merry
bash: v04: readonly variable
$