連想配列の宣言を行います。
declare -A は、bash ver3 では使えませんが、declare_AssociativeArrayClass は、
bash ver3 と bash ver4 のどちらでも使えます。
サンプル
$declare_AssociativeArrayClass object #// 変数 object を連想配列として宣言する
if [ "${BASH_VERSINFO[0]}" -ge "4" ];then
declare_AssociativeArrayClass="declare -A" #// bash ver4
else
declare_AssociativeArrayClass="declare" #// bash ver3
fi
$declare_AssociativeArrayClass object
サンプル
メイン・スクリプト・ファイルのグローバル変数
declare_AssociativeArrayClass は、メイン・スクリプト・ファイルの末尾にある bashlib
include が行われてから使えますが、その前であるメイン・スクリプト・ファイルの
グローバルに連想配列を宣言するときは、その前に、declare_AssociativeArrayClass の
実装をコピーしてください。
Attr_func <self> <AttrName> ; <Value>="$g_Ret"
連想配列の値(オブジェクトの属性の値)を、返します。
【引数】
self
連想配列の変数名=オブジェクト名
属性名=連想配列のキー
AttrName
サンプル
$declare_AssociativeArrayClass object_a
object_a["Attr1"]="Value1"
Attr_func object_a "Attr1"
echo "$g_Ret"
(出力)属性の値=連想配列の値
g_Ret
参考
SetAttr_func <self> <AttrName> <Value>
連想配列の値(オブジェクトの属性の値)を、設定します。
【引数】
self
連想配列の変数名=オブジェクト名
属性名=連想配列のキー。 英数字から始めること
AttrName
サンプル
$declare_AssociativeArrayClass object_a
local obj
obj="object_a"
SetAttr_func $obj "Attr1" "Value1"
属性の値=連想配列の値
Value
参考
bash ver3 では、連想配列の代わりに、bashlib が用意した擬似連想配列を使います。
bash ver4 でも、連想配列の名前を変数に代入した変数から、連想配列の値を参照
するには、SetAttr_func 関数の中で行っている複雑な記述が必要になります。
C言語的に表現すると、構造体のポインターからメンバー変数への代入になります。
obj = &object_a;
obj->Attr1 = "Value1";
サンプル
$declare_AssociativeArrayClass object_a
SetAttr_func object_a "Attr1" "Value1"
C言語的に表現すると、構造体のメンバー変数への代入になります。
object_a.Attr1 = "Value1";
object_a[Attr1]="Value1"
bash ver4 的に表現すると、
テスト
サンプル
function Main_func()
{
$declare_AssociativeArrayClass object_a
Sub_func object_a
Attr_func object_a "Attr1" ; echo "$g_Ret"
Attr_func object_a "Attr2" ; echo "$g_Ret"
}
function Sub_func()
{
local AssocArrayName="$1"
SetAttr_func $AssocArrayName "Attr1" "Value 1"
SetAttr_func $AssocArrayName "Attr2" "Value 2"
}
連想配列の名前を代入した変数から、連想配列の値を参照する
関数の中で、連想配列に代入する
AssociativeArrayClass.getLength_method <self> ; <Length>="$g_Ret"
連想配列の要素数を返します。
【引数】
self
連想配列の変数名=オブジェクト名
(出力)要素数
g_Ret
$declare_AssociativeArrayClass assoc_arr
SetAttr_func assoc_arr "Key1" "Value1"
SetAttr_func assoc_arr "Key2" "Value2"
AssociativeArrayClass.getLength_method assoc_arr
echo "Length=$g_Ret"
サンプル
テスト
AssociativeArrayClass.getKeys_method <self> ; <Keys>=( $g_Ret )
連想配列にあるすべてのキー(オブジェクトのすべての属性名)を返します。
【引数】
self
連想配列の変数名=オブジェクト名
(出力)すべてのキー(フィールド形式)
g_Ret
$declare_AssociativeArrayClass assoc_arr
SetAttr_func assoc_arr "Key1" "Value1"
SetAttr_func assoc_arr "Key2" "Value2"
AssociativeArrayClass.getKeys_method assoc_arr
local keys=( $g_Ret )
local key
for key in "${keys[@]}" ;do
Attr_func assoc_arr "$key"
echo "$key = $g_Ret"
done ; done_func $?
サンプル
テスト
値に空白文字を含む場合、正しく動作しません。
AssociativeArrayClass.getItems_method <self> ; <Keys>=( $g_Ret )
連想配列にあるすべての値(オブジェクトのすべての属性値)を返します。
【引数】
self
連想配列の変数名=オブジェクト名
(出力)すべてのキー(フィールド形式)
g_Ret
$declare_AssociativeArrayClass assoc_arr
SetAttr_func assoc_arr "Key1" "Value1"
SetAttr_func assoc_arr "Key2" "Value2"
AssociativeArrayClass.getItems_method assoc_arr
local values=( $g_Ret )
サンプル
値に空白文字を含む場合、正しく動作しません。
AssociativeArrayClass.getKeys_method のサンプルのように、キーのループを
使ってください。
テスト
AssociativeArrayClass.destroy_method <self>
連想配列(オブジェクト)を削除します。
【引数】
self
連想配列の変数名=オブジェクト名
$declare_AssociativeArrayClass assoc_arr
SetAttr_func assoc_arr "Key1" "Value1"
SetAttr_func assoc_arr "Key2" "Value2"
AssociativeArrayClass.destroy_method assoc_arr
サンプル
テスト
CopyArray_func <DstArray> <SrcArray>
配列、または、連想配列をコピーします。
【引数】
DstArray
(出力)コピー先の配列変数名
コピー元の配列変数名
SrcArray
$declare_AssociativeArrayClass ObjectA
SetAttr_func ObjectA "Attr1" "Value1"
SetAttr_func ObjectA "Attr2" "Value2"
SetAttr_func ObjectA "Attr3" "Value3"
local arr=ObjectA
$declare_AssociativeArrayClass ObjectB
CopyArray_func ObjectB $arr
サンプル
テスト
CopyArrayAttr_func <self> <AttrName> <out_Array>
指定したオブジェクトの、配列型の属性の値を取得します。
【引数】
self
連想配列の変数名=オブジェクト名
属性名=連想配列のキー
AttrName
(出力) 属性の配列のコピー
out_Array
$declare_AssociativeArrayClass obj
local arr
SetAttr_as_ArrayName_func obj "AttrA" "a" "b" "c"
CopyArrayAttr_func obj "AttrA" arr #//[out] arr
Assert_func '"${arr[0]}" = "a"'
Assert_func '"${arr[1]}" = "b"'
Assert_func '"${arr[2]}" = "c"'
サンプル
テスト
SetAttr_as_ArrayName_func <self> <AttrName> <Params> ...
配列を生成して、その配列を、連想配列のアイテムに代入します。
【引数】
self
連想配列の変数名=オブジェクト名
属性名=連想配列のキー
AttrName
生成する配列の要素の並び
Params ...
$declare_AssociativeArrayClass obj
local arr
SetAttr_as_ArrayName_func obj "AttrA" "a" "b" "c"
CopyArrayAttr_func obj "AttrA" arr #//[out] arr
Assert_func '"${arr[0]}" = "a"'
Assert_func '"${arr[1]}" = "b"'
Assert_func '"${arr[2]}" = "c"'
サンプル
テスト
SetAttr_as_AssociativeArrayName_func <self> <AttrName> <Params> ...
連想配列を生成して、その連想配列を、別の連想配列のアイテムに代入します。
【引数】
self
連想配列の変数名=オブジェクト名
属性名=別の連想配列のキー
AttrName
サンプル
$declare_AssociativeArrayClass object
local obj=object
SetAttr_as_AssociativeArrayName_func $obj "Assoc" \
AttrA "ValueA" \
AttrB "ValueB"
Attr_func $obj "Assoc" ; assoc="$g_Ret"
Attr_func $assoc "AttrA"
Assert_func "$g_Ret" == "ValueA"
Attr_func $assoc "AttrB"
Assert_func "$g_Ret" == "ValueB"
上記のサンプルを、C言語的に表現すると、
obj->Assoc->AttrA = "ValueA";
obj->Assoc->AttrB = "ValueB";
assoc = obj->Assoc;
ASSERT( assoc->AttrA == "ValueA" );
ASSERT( assoc->AttrB == "ValueB" );
Params ...
生成する連想配列のキーと値の並び
テスト
bashlib を使うには、メイン・スクリプト・ファイルの末尾に、bashlib をインクルードする
十数行のコードを配置する必要があります。 menu から新規作成
スクリプト・ファイルには、そのコードが含まれています。
scriptlib
main
sample
メイン・スクリプトの末尾にある bashlib include
のコードから、bashlib_inc.sh をインクルードする
bashlib_inc.sh
bashlib.sh
bashlib3.sh
bashlib_inc.sh から、
すべてのライブラリをインクルードする
インクルードの構成
メイン・スクリプト・ファイルがあるフォルダーに scriptlib フォルダーがあれば、それを
使いますが、無ければ、親フォルダーの方向に scriptlib を探します。 その動きは
と同じです。
bashlib を使うスクリプトは、Main_func から内容を記述します。
プロセス起動時のカレント・フォルダーの絶対パス。
プロセスを起動した時のコマンドライン。
してできた
Main_func <Option> <AppKey>
bashlib を使うスクリプトは、この Main_func から内容を記述します。
【引数】
Option
AppKey
未定義
アプリケーション・キー
ユーザ定義関数です。
引数はあってもなくてもかまいませんが、ファイルに出力するスクリプトは、
を呼ぶ必要があります。
AppKey 引数を使った
Main_func 関数を定義しているスクリプト・ファイルの中に、
(bashlib をインクルードして Main_func を呼び出すコード)が必要です。
のコード
Main_func 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダー
になります。 起動したときのカレント・フォルダーは、
に入っています。
サンプル
declare g_StartInPath as string
プロセス起動時のカレント・フォルダーの絶対パス。
Main_func 関数を呼ばれたときのカレント・フォルダーは、メイン・シェルスクリプト・ファイル
があるフォルダーになります。 プロセス起動時のカレント・フォルダーは、g_StartInPath から
取得する必要があります。
このように変更した理由は、書かれたスクリプトが、汎用コマンドとして使われることより、
スクリプトがあるフォルダーに対して固有の処理を行うことが多いためです。
g_StartInPath を変更すると、
cd "$g_StartInPath"
サンプル
テスト
の基準フォルダーを変更することができます。
declare g_Arguments as array of string
プロセスを起動した時のコマンドライン。
./sample.sh -o opt_param --option="param X" Param1 "Param 2"
サンプル
起動したときのコマンド:
g_Arguments の値:
"${g_Arguments[0]}" == "/home/user1/sample.sh"
"${g_Arguments[1]}" == "-o"
"${g_Arguments[2]}" == "opt_param"
"${g_Arguments[3]}" == "--option=param X"
"${g_Arguments[4]}" == "Param1"
"${g_Arguments[5]}" == "Param 2"
関連
パラメーターをシフトします。
テスト
サンプル
ArrayClass.remove_method g_Arguments 1
コマンドラインの第1パラメーターを削除します。
サンプル
local here ; here=`dirname "${g_Arguments[0]}"`
スクリプトが入っているフォルダーのパス
エラー処理
パイプを使った処理において、エラーを検出します。
ループの直後に、; done_func $? を記述してください。
エラーを発生させます。
エラーメッセージ。
終了ステータスのコピー。
エラーをキャッチします。構造化例外処理。
処理中のエラーを、上位の TryStart に投げます。
エラーをクリアします。
CheckPipeStatus_func <PipeStatus>
直前のパイプを使った処理において、1つでも終了ステータスが 0 以外ならエラーにします。
【引数】
PipeStatus
"${PIPESTATUS[@]}" を指定してください
サンプル
true | false
CheckPipeStatus_func "${PIPESTATUS[@]}"
テスト
サンプル
line=`cat "not_found" | head --lines=1 ; CheckPipeStatus_func "${PIPESTATUS[@]}"`
CheckPipeStatus_func を使わないと、パイプの最後の段のエラーしか検出しません。
while true; do
CheckWritable_func "$PWD/out/a.txt"
break
done ; done_func $?
; done_func $?
ループの直後(break コマンドのジャンプ先)に、; done_func $? 記述してください。
エラーが発生した状態にも関わらず、ループのすぐ外から続きを実行することが、
なくなります。
テスト
Error_func [<Message>]
エラーを発生させます。 標準エラー出力にメッセージを表示します。
【引数】
Message
メッセージ。省略時=メッセージなしのエラー
サンプル
Error_func "エラー"
<ERROR msg="エラー"/>
表示例:
表示例:
<ERROR msg="エラー" value="123"/>
value="123"
Error_func "<ERROR msg=\"エラー\" value=\"$value\"/>"
サンプル
<ERROR> タグを指定すると、そのまま表示します。
エラーメッセージは、<ERROR> タグを付けて表示されます。
エラーメッセージは、g_Err_Desc 変数に格納されます。
終了ステータス(return値)は、1になります。
テスト
表示例:
<ERROR/>
Error_func
サンプル
引数を省略したとき
declare g_Err_Desc as string
エラーメッセージ。
を呼び出すと、g_Err_Desc にエラーメッセージが格納されます。
Error_func 以外で発生したエラーでは、メッセージは格納されません。
サンプル
echo "$g_Err_Desc" >&2
declare g_ExitStatus as integer
終了ステータスのコピー。
終了ステータスが 0 以外になると、TryEnd2_func にジャンプして、
g_ExitStatus にその終了ステータスが格納されます。
bashlib を使う環境では、
を呼び出すと、0 にクリアされます。
エラー処理モードなら、1〜255 のどれかが、通常モードなら 0 が入っています。
の間で実行したコマンドの
サンプル
if [ "$g_ExitStatus" == "2" ];then
while TryStart_func; do
CheckWritable_func "$PWD/out/a.txt"
TryEnd1_func; done ;TryEnd2_func $?
if [ "$g_ExitStatus" == "0" ]; then Error_func "Error exptected" ;fi
echo "${g_Err_Desc}${LF}This error is OK"; ErrClass.clear_method
TryStart_func
TryEnd1_func
TryEnd2_func $?
テスト
エラーをキャッチします。
エラーが発生してもシェル・スクリプトを終了させたくないときに使います。
サンプル
while TryStart_func; do
CheckWritable_func "$PWD/out/a.txt"
TryEnd1_func; done ;TryEnd2_func $?
#// Finally
if [ "$g_ExitStatus" != "0" ]; then ErrClass.raiseOverwrite_method ;fi
エラーであることのテスト
サンプル
Finally ブロック。 正常時でもエラー時でも実行するブロック。
TryStart_func 〜 TryEnd2_func の間で実行したコマンドの終了ステータスが 0 以外に
なると、TryEnd2_func にジャンプして、終了ステータスを g_ExitStatus 変数に格納し、
エラー処理モードに入ります。
エラーが発生したときは、必要なエラー処理を行った後で、ErrClass.clear_method を
呼び出してエラー処理モードから通常モードに戻すか、Error_func または
ErrClass.raiseOverwrite_method を呼び出して、コールスタックの浅い方にある
TryStart_func 〜 TryEnd2_func にジャンプするか、シェル・スクリプトを正しく異常終了
する必要があります。
bashlib は、終了ステータスをエラー番号として扱い、終了ステータスが 0 以外なら
エラーが発生したものとみなします。 これは、bash の -e オプションや、make と同じ
仕様です。
関連
TryStart_func
TryEnd1_func
TryEnd2_func $?