bashでパイプ(標準入力)から受け付けた内容を変数に代入する

パイプから受け付けた内容を変数に入れる場合、以下の2パターンが考えられる。

1.readを用いる

普通にwhileなんかで使うように、readを使って代入をする。
この際、{}や()でグループ化をする必要がある。

echo ABC | { read v ;echo -e "$v"_TEST; }
echo ABC | (read v ;echo -e "$v"_TEST;)
[root@BS-PUB-CENT7-02 ~]# echo ABC | { read v ;echo -e "$v"_TEST; }
ABC_TEST
[root@BS-PUB-CENT7-02 ~]# echo ABC | (read v ;echo -e "$v"_TEST;)
ABC_TEST

 

ただし、もしパイプから受け付ける内容が複数行だった場合、1行目しか受け付けられない。
このため、readを使う場合はwhileと組み合わせて1行ずつ対応してやるなどが必要になる。

[root@BS-PUB-CENT7-02 ~]# echo -e "ABC\nDEF" | (read v ;echo -e "$v"_TEST;)
ABC_TEST
Sponsored Links

2.catを使う

readを使うほかだと、catを用いる方法がある。

echo -e "ABC" | { v=$(cat) ;echo -e "$v"_TEST; }
echo -e "ABC" | (v=$(cat) ;echo -e "$v"_TEST;)
[root@BS-PUB-CENT7-02 ~]# echo -e "ABC" | { v=$(cat) ;echo -e "$v"_TEST; }
ABC_TEST
[root@BS-PUB-CENT7-02 ~]# echo -e "ABC" | (v=$(cat) ;echo -e "$v"_TEST;)
ABC_TEST

 

なお、こちらの場合だと複数行でも変数内にそのまま入る。

[root@BS-PUB-CENT7-02 ~]# echo -e "ABC\nDEF" | (v=$(cat) ;echo -e "$v"_TEST;)
ABC
DEF_TEST

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*