質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

3回答

9560閲覧

bashでファイルの行を読み込んで連想配列にしたい。

itanoma

総合スコア13

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2018/12/07 08:14

シェルスクリプトでファイルにかかれているKey:Value形式の行を読み込んで連想配列を作りたいです。

以下のようなリストファイルがあるとして

$ cat list.txt [111]="aaa" [222]="bbb" [333]="ccc"

リストファイルをもとにITEMへ代入しようと思いました。

shell

1# test.sh 2#!/bin/bash 3declare -A ITEM 4ITEM=(`cat list.txt`)

しかし、実行すると下記のようなメッセージが出力されてしまいます。これはおそらく[111]="aaa"自体がvalueとして扱われている状態で、添字(=Key)がないですよ。ということだと思います。

$ ./test.sh a.sh: 行 3: ITEM: [111]="aaa": 連想配列を設定するときには添字をつけなければいけません a.sh: 行 3: ITEM: [222]="bbb": 連想配列を設定するときには添字をつけなければいけません a.sh: 行 3: ITEM: [333]="ccc": 連想配列を設定するときには添字をつけなければいけません

本当は下記のようにITEMへ引数を代入したいのですが、標準出力をそのままITEMに代入してもうまく扱ってくれないのです。
ITEM=([111]="aaa" [222]="bbb" [333]="ccc")

このように用意されたリストファイルから読み込んだものを連想配列の変数に入れるにはどのようにすればよいでしょうか。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2018/12/07 09:18

list.txt はご提示されたフォーマットでなければいけないのですか?
itanoma

2018/12/07 09:29

このようなフォーマットのときどう処理するかを考えたかったので、質問内容としてはこのフォーマットでなければいけません。しかし、自分でもうまい方法が見つけられていないので、正直、valueだけを羅列したリストファイルを作ろうと考えています。
guest

回答3

0

ベストアンサー

eval を使えばできると思います。

投稿2018/12/07 09:47

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itanoma

2018/12/07 09:57

ありがとうございます。調べてみようと思います。
itanoma

2018/12/07 10:20

evalを頭につけることで処理できました。誠にありがとうございます。
guest

0

evalを使うことで解決できました。誠にありがとうございます。

$ cat list.txt [111]="aaa" [222]="bbb" [333]="ccc"
$ vim test3.sh #!/bin/bash declare -A ITEM eval ITEM=(`cat list.txt`) echo ${ITEM[@]} # 実行 $ ./test3.sh aaa ccc bbb

投稿2018/12/07 10:17

編集2018/12/07 10:49
itanoma

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

list.txtのフォーマットの質問がありました。ありがとうございます。

このような場合どううまく処理できるかを模索しているなかで、お知恵をお借りできればと思っておりました。

$ cat list.txt [111]="aaa" [222]="bbb" [333]="ccc"

しかし、実際のところうまく処理する方法が見つかっておりません。そのため、フォーマットについてはvalueのみを羅列したリストファイルを作り、その上で一応、別解として処理内容を考えました。

$ cat list2.txt aaa bbb ccc
$ vim test2.sh #!/bin/bash declare -A ITEM ITEM=( [111]="-" [222]="-" [333]="-" ) list2=`cat list2.txt` while read a111 b222 c333 do ITEM=([111]=$a111 [222]=$b222 [333]=$c333) echo ${ITEM[@]} done <<END $list2 END # 実行 $ ./test2.sh aaa bbb ccc

以上で結果としてはやりたいことは出来ています。

投稿2018/12/07 09:55

itanoma

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問