まえがき
本稿は、ボンクラな自分への戒めです(´・ω・`)
繰り返し処理
こう書く。
#!/bin/bash
# for...in
for i in "aaa" "bbb" "ccc"
do
echo ${i}
done
上記の場合、aaa
bbb
ccc
はそれぞれ値であり、順次$i
に格納されていく。
変数をつかった繰り返し処理
変数が文字列
変数に入った文字列を使って書くとこうなる。
#!/bin/bash
params="aaa bbb ccc"
# for...in
for i in ${params}
do
echo ${i}
done
変数に入ったところで話はさっきのと同じ。
値aaa
とbbb
とccc
が順次処理される。
変数が配列
変数に入った配列を使って書くとこうなる。
#!/bin/bash
params=(aaa bbb ccc)
# for...in
for i in ${params[@]}
do
echo ${i}
done
ちょっと変わった。
${params[@]}
は、入っている値を文字列として連結した値を返す。
この際の区切文字は半角スペースっぽい。
それを順次取り出して$i
に入れている様子。
つまり、Bashの繰り返し処理は連結した文字列を処理するもので、
配列をつかう場合は値を連結した文字列に変換してから処理をしなければダメみたい。
繰り返し処理といえば配列な自分には、ピンと来るのに時間がかかりました(;´Д`)
なぜこんなことを?
まぁ、Bashを書きなれている人には当たり前のことだったのかもしれませんが、
自分はドはまりしました。。(/ω\)
サーバーへのソース反映にJenkinsを使用しているんですが、ビルドシェルの流れは↓の感じ。
- ビルドパラメータで値を複数受け取る
- 通常のビルド処理実行
- ビルド後、受け取ったビルドパラメータごとに適宜処理を実行
このジョブはそれなりの期間うごかしていましたが、特に問題も出さず、正常に動いていました。
・・・・そうなると欲が出ましてね。。。(;^ω^)
自分はローカル開発はVagrantで仮想環境をたててやっているんですが、3.と同じ処理をローカル環境でも実行したくなったわけです。
なので、ビルドシェルをコピペしてローカル用にシェルを作成したんですが、
まー動かず・・・・(ノД`)・゜・。
Bashを書くのは久しぶりな上、そもそも繰り返し処理が必要なほど複雑なものはほとんど書いたことが無いので、もう混乱しました。。。
混乱しつつ導き出したその理由が、本稿のとおりでございます。(´・ω・`)
ビルドパラメータは「テキスト」でいれていたので、文字列だったんですね。。
で、ローカルにつくったシェルの方は、引数で受け取ったのを配列に入れてたんです・・・・orz
#!/bin/bash
# このbuild_paramsは連結済みの文字列
for build_param in ${build_params}
do
echo "build_param is ${build_param}"
done
#!/bin/bash
build_params=("$@")
# このbuild_paramsはとーぜん配列
for build_param in ${build_params}
do
echo "build_param is ${build_param}"
done
あとがき
ネットで観たのをただコピペして作らず、ちゃんと理解して作ろうね?!
・・・・という自分への戒め。