Help us understand the problem. What is going on with this article?

Bashの繰り返し処理を覚えるよ

More than 1 year has passed since last update.

まえがき

本稿は、ボンクラな自分への戒めです(´・ω・`)

繰り返し処理

こう書く。

#!/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

変数に入ったところで話はさっきのと同じ。
aaabbbcccが順次処理される。

変数が配列

変数に入った配列を使って書くとこうなる。

#!/bin/bash

params=(aaa bbb ccc)

# for...in
for i in ${params[@]}
do
    echo ${i}
done

ちょっと変わった。

${params[@]}は、入っている値を文字列として連結した値を返す。
この際の区切文字は半角スペースっぽい。
それを順次取り出して$iに入れている様子。

つまり、Bashの繰り返し処理は連結した文字列を処理するもので、
配列をつかう場合は値を連結した文字列に変換してから処理をしなければダメみたい。

繰り返し処理といえば配列な自分には、ピンと来るのに時間がかかりました(;´Д`)

なぜこんなことを?

まぁ、Bashを書きなれている人には当たり前のことだったのかもしれませんが、
自分はドはまりしました。。(/ω\)

サーバーへのソース反映にJenkinsを使用しているんですが、ビルドシェルの流れは↓の感じ。

  1. ビルドパラメータで値を複数受け取る
  2. 通常のビルド処理実行
  3. ビルド後、受け取ったビルドパラメータごとに適宜処理を実行

このジョブはそれなりの期間うごかしていましたが、特に問題も出さず、正常に動いていました。

・・・・そうなると欲が出ましてね。。。(;^ω^)
自分はローカル開発はVagrantで仮想環境をたててやっているんですが、3.と同じ処理をローカル環境でも実行したくなったわけです。

なので、ビルドシェルをコピペしてローカル用にシェルを作成したんですが、
まー動かず・・・・(ノД`)・゜・。
Bashを書くのは久しぶりな上、そもそも繰り返し処理が必要なほど複雑なものはほとんど書いたことが無いので、もう混乱しました。。。

混乱しつつ導き出したその理由が、本稿のとおりでございます。(´・ω・`)

ビルドパラメータは「テキスト」でいれていたので、文字列だったんですね。。
で、ローカルにつくったシェルの方は、引数で受け取ったのを配列に入れてたんです・・・・orz

Jenkins
#!/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

あとがき

ネットで観たのをただコピペして作らず、ちゃんと理解して作ろうね?!

・・・・という自分への戒め。

clustfe
最近はフリーランスでやらしてもらっています 仕事としてはPHPが99%・・・・のわりに技術は浅いです(´・ω・`) あと、PS2「ボクと魔王」が好きです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away