Linux講座にようこそ。このページは「Linuxの使い方 - 第6章 シェルスクリプトの作り方」です。
少し大きめなシェルスクリプトになりますと、複数の機能を持っています。このようなものを1つのファイルとして作りますと、次のような不具合が考えられます。
これらの対応策として、機能毎のモジュール(部品)化が考えられます。この部品がシェルスクリプトの場合は関数になります。
関数はシェルスクリプト中に記述することも出来ますし、関数だけを別のファイルに記述しておくことも出来ます。また、特別な使い方として、aliasコマンドで定義したコマンドは引数の指定が出来ませんが、関数の場合は出来ますので、aliasコマンドの拡張機能的に使うことも出来ます。
ここでは次の事項に付いて説明します。
変数は必要なときに名前を指定してすぐに使うことが出来ますが、この場合のデータは文字データとして変数に格納されます。一方、変数は明示的に宣言してから使用することも出来ますが、この場合はいろいろな属性を与えることが出来ます。
変数の宣言はdeclareまたはtypesetコマンド、及びlocalコマンドで行います。declareコマンドには次のようなオプションがあります。
オプション | 意味 |
---|---|
-a | 変数を配列として作成します。 |
-i | 変数を整数型(integer)として作成します。 |
-r | 変数を参照のみ可能(read only)として作成します。 |
-f | 定義済関数を表示します。 |
-F | 定義済関数名を表示します。 |
配列は連続した変数領域で、同じ種類のデータを複数扱うときに使用します。つまり、1つの配列に複数のデータを格納できるということです。配列中の個々のデータを取り扱うときには何番目のデータなのかを指定します。この番号を添字と呼んでおり、0から始まる整数で指定します。
-iオプションを付けて整数型として宣言した変数は整数演算用として宣言したことになりますので、「$(( 式 ))」の形式でなくても「式」だけで演算が出来ます。ただし、演算子の前後に空白を入れてはいけません。また、値の参照のための$も省略可能です。さらに、代入する値も整数型とみなしますので、代入する変数が文字型の場合は整数型に変換されます。(例題2をご覧ください)
read onlyとした場合は後からその変数に値を設定することは出来ませんので、宣言時に値を与えておきます。また、read onlyの解除は「+r」オプションで再宣言を行えば可能です。
変数には有効範囲があります。つまり、シェルスクリプト中のどこでも使えるもの(グローバル変数)と、関数内だけで使えるもの(ローカル変数)です。関数内でlocalコマンドで宣言しますとローカル変数になります。それ以外の変数はグローバル変数です。また、位置パラメータはローカル変数です。
図6-2で、(1)はシェルスクリプト内全体に有効(グローバル変数)を、(2)は関数の外側、(3)は関数内で有効(ローカル変数)を表しています。(1)に該当する変数はval00、val01、val03、val04で、(2)に該当する変数は$2で、(3)に該当する変数はval02と$1です。
配列の宣言で、-i
や-r
オプションの指定もできます。また、localコマンドで配列の宣言も出来ますし、-i
や-r
オプションの指定もできます。
配列の使い方を示します。
$ 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 $
整数型と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 $