この投稿はShell Script Advent Calendar 21日目です
お願い
ええそれ違うんじゃない?もっとこういうやり方あるよ!
という方は、是非是非コメントで教えていただけると嬉しいです。。
はじめに
シェルスクリプト(bash)で、
改行入りの値を取得するコマンドを叩いた後に、
変数には改行ありの値が入っているはずなのに、
echoで表示した時に改行されたりされなかったりして混乱したというお話
そこで今回は、値の取得編
と 値の表示編
に分けて、改行に関する備忘録を残します
解決方法
サンプルとして、以下のテキストファイル内の値を取得するコマンドを叩くとします
テキストファイル内の値を取得するコマンドについては今回省略します。。
sample.txt
aaa
bb
ccc
値の取得編
- sample.txtの値が
改行なし
で ${FUGA} に代入される
FUGA=$(echo `sample.txt の値を取ってくるコマンド`)
- sample.txtの値が
改行あり
で ${HOGE} に代入される
HOGE=$(sample.txt の値を取ってくるコマンド)
値の取得時に改行を無視する OR しないについては、当初わたしが調べた際は期待した回答が得られなかった。。
圧倒的ぐぐり力不足。。
「echoコマンド
にsample.txt の値を取ってくるコマンド
を渡したもの」を変数に代入すると、改行が無視された値が入る
echoコマンド
を付与せずに、「素?のsample.txt の値を取ってくるコマンド
」を変数に代入すると、改行ありの値が入る
ちょっと考えると、それはそうなんだよなあ(困惑)
混乱が解けたのでよかった()
値の表示編
ちょっとややこしい。。
- 改行があっても
無視される
パターン:echo ${変数}
echo ${FUGA}
# -> そもそも改行が無視されて値が代入されているので、改行がない(されない)
echo ${HOGE}
# -> 改行ありで値が代入されているけれど、改行されない
実行結果:
- FUGA
aaa bb ccc
- HOGE
aaa bb ccc
- 改行があっても
無視されない
パターン:echo "${変数}"
echo "${FUGA}"
# -> そもそも改行が無視されて値が代入されているので、改行がない(されない)
echo "${HOGE}"
# -> 改行ありで値が代入されているので、改行される!!
実行結果:
- FUGA
aaa bb ccc
- HOGE
aaa
bb
ccc
echoについては、ググったら先人たちの知恵がたくさん出てきた。。ありがとうございます。。
なぜこうなったのか
おそらく、
値の取得
をする時点で、その値に対して何らかの処理(grepとか)をしたくて、echo
をつけたりつけなかったり試行錯誤していて、
そのあと値の取得と処理ができるようになって、echo
が必要なくなったので消したつもりだったんだけど、
ちゃんと消せたところと、消し忘れたところが混在してしまった(ヒューマンエラー)
がために、
改行されないことについて色々とググって調べて試しているうちに、
値の取得
の時点ですでに改行が無視されている
のか、値の表示
の時点で改行を無視している
のかわからなくなってしまった(混乱)
のだと思われます。。落ち着こうね、休憩しようね
HOGE=$(echo "`なんかどっかからlistを取ってくるコマンド`")
↑こんな感じのコードを書いた痕跡もあった
おわりに(感想)
先人たちが残してくれた記録は尊いし、だいたいあってる。。(2回目)
ぐぐるチカラ(キーワードの選定とか、キーワードの繋げかたとか。。)はもっと磨いておこうと思いました。