まなざしのむこうがわ

読んだ本のこととか、考えたこととか。

bashでJavaから返されたリストをfor文で回す

String型のリストを返すJavaのメソッドをbashから呼び出して、返ってきたリストをforループさせる方法。

とある事情で必要になったのだが、調べ方が良くなかったからか意外と見つからなかったので、メモしておく。

Javaサンプルコード

import java.util.ArrayList;
import java.util.List;

public class ReturnList {
    public static void main(String[] args) {

        List<String> result = new ArrayList<String>();

        result.add("108");
        result.add("12");
        result.add("563");

        System.out.println(result);
    }
}

bashコマンド

上のJavaメソッドをふつうに実行してfor文を回そうとすると、うまくいかない。

ふつうに実行する

testlist=$(java ReturnList)
for test in ${testlist} 
do
    echo ${test}
done

##### 実行結果 #####
[108,
12,
563]

リストのままでは上手くfor文が回せず、単なる文字列みたいになってしまう模様。

edコマンドを使って整形する

そこで、sedコマンドを使って文字列を置換し、for文を回せるように整形してやる。 最初はリストを配列にセットし直せないかと思っていろいろやってみたが、どうやらbashでは配列でなくても文字列を改行で区切ればfor文で回せるっぽい。

参考:BashでStringから配列に変換してfor文で回す - くらげになりたい。

testlist=$(java ReturnList | sed -e 's/\,/\\n/g' | sed -e 's/\[//g' | sed -e 's/\]//g'| sed -e 's/ //g')
for test in ${testlist} 
do
    echo ${test}
done

##### 実行結果 #####
108
12
563

本当なら、JSON形式で値を返しjqコマンドを使ってきれいに処理したかったが……。