(for Internet Explorer)
連想配列の宣言を行います。
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 $?