- 市川諒
- 約 1,500 文字
- 21,200 View
はじめに
こんにちは、TIGの市川です。シェルスクリプト連載の4日目です。
過去Shell Scriptでゴリゴリスクリプトを書いたりしていましたが(環境が許せば)Pythonで書くことが個人的に増えてきました。いざShell Scriptに戻ってきたときに配列と連想配列について調べ直すコトがままあったので、ここに記したいと思います。
declareとは
昨今Declarative programmingやらDeclarative APIやら、IT界隈でも形容詞で登場する単語ですが、Linuxのコマンドでdeclareというと変数を宣言する為のコマンドになります。
Shell Scriptではご存じの通り特に変数を宣言せずとも利用可能ですが、このコマンドとともに宣言すると色々な恩恵を受けることができます。
# オプションなしだと普通の変数と同じように使える |
declareのオプション
| オプション | 説明 |
|---|---|
| -a | 変数を配列として定義する |
| -A | 変数を連想配列として定義する |
| -i | 変数を数値用に定義する(文字列などは代入不可になる) |
| -l | 変数から取得される値を常に小文字にする |
| -u | 変数から取得される値を常に大文字にする |
| -n | 変数を名前参照として定義する(シンボリックリンクのようなもの) |
| -r | 変数を定数として定義する(readonlyな変数となり、定義時に値を格納する) |
| -x | 変数を環境変数として定義する(定義したタイミングでexportされる) |
語り出してしまうとボリュームがそこそこになってしまうので、オプションの中の配列と連想配列について以降触れていきたいと思います。
Shell Scriptで配列
「declareで」といいながら実は配列はdeclareで宣言せずとも使えたりします。
ですが、せっかくなので宣言して使います。
- コード
# データをSplitして配列を作る |
- 出力
================== Output ================== |
Shell Scriptで連想配列
連想配列を使う場合はdeclareが必須となっています。また、Bashであればversion4以降で利用可能です。
Pythonでいう辞書などと同様に、格納した順番は担保されません。
- コード
# declareする(初期値は後からでも格納可能) |
- 出力
================== Output ================== |
bashの辞書で多次元配列
さて、ここで少々(個人的に)致命的な問題があるのですが、bashの配列・連想配列は1次元しか扱えないという点です。
他言語だとしれっと使えてしまうので、「えっ、なんで!?」となりがちですが、多次元配列「的な」ものを作ることでそれっぽい処理は可能です。
例えばPythonだとさらっと配列に辞書を含めるとかやりがち
- コード
# Pythonでの配列内に連想配列がある場合の例 |
- 出力
[ |
bashの場合、多次元配列や配列内に連想配列を含められないため、KeyにIndexを持たせてしまうというハックがあります。
試しにCSVを読み込んで連想配列としつつ、一部ロジックを組み込んだ例を挙げます。従業員の今年度評定を基に翌年度の新給与を決めるロジック(的な)ものを処理します。
- テスト用CSV(氏名, 年齢, 役職, 今年度評定)
Angela,29,Engineer,1800,A |
- コード
FILEPATH="test.csv" |
- 出力
Angela 1800 |
連想配列使うまでもないのですが、読み込んだ値からその後様々な処理をすることを考えると、連想配列は非常に扱いやすいため、覚えておいて損はないと思っています。
もし、Key, Value形式で値を持ちたい、使い回したいのであればオススメの実装です。
まとめ
ということで今更ながらではありますが、bashの配列と連想配列についておさらいをしました。
個人的には文字列操作でなんとかなる領域を超えたら可読性や拡張性からPythonやGoなどを使うべし、と考えています。
ただし、現状もPython2.x系がデフォルトのOSがあったり、Goとか新規言語をインストールできない! などの制約があったり、bashでどうしても書かねばならないときにそっと頭の片隅においていただけると幸いです。
シェルスクリプト連載の4日目でした。明日は澁川さんのシェルスクリプトでもGUIです!