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コマンドを使ってきれいに処理したかったが……。