シェルプログラミング - for

$ bash -version | head -n 1
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

for文の記載方法でも「; do」を使って短くできます。自分が使っていなかっただけで昔からできたようです。

任意の回数の繰り返し - for

「((」と「))」になっているので注意してください。

for ((i=0; i < 5; i++))
do
  echo ${i}
done
----- OUTPUT -----
0
1
2
3
4

任意の回数の繰り返し - for in

for in を使って任意の回数を繰り返す。

for i in `seq 0 5`
do
  echo $i;
done

----- OUTPUT -----
1
2
3
4
5

{1..5} の記述は、「1 2 3 4 5」に置き換わります

for i in {1..5}
do
  echo ${i};
done

----- OUTPUT -----
1
2
3
4
5

配列の繰り返し

配列宣言時は、要素を半角スペースで区切ります。
「AAA BBB CCC」のようにします。

for VAL in AAA BBB CCC
do
    echo ${VAL}
done
----- OUTPUT -----
AAA
BBB
CCC

for VAL in AAA BBB CCC; do
    echo ${VAL}
done
----- OUTPUT -----
AAA
BBB
CCC

配列の中身を処理する場合は以下のようになります。

LIST=("AAA" "BBB" "CCC")

echo ${LIST[@]}

for VAL in ${LIST[@]}
do
    echo ${VAL}
done

----- OUTPUT -----
AAA BBB CCC
AAA
BBB
CCC

【NG例】最初は以下のようにして?となりました…

LIST=("AAA" "BBB" "CCC")

echo ${LIST} # これだと配列の先頭しか表示されない

for VAL in ${LIST}
do
    echo ${VAL} # これだと配列の先頭しか表示されない
done

配列の中身を処理する場合で、for inを使わない方法もあります。
以下は同じ動作になります。
スピードなどでどちらが有利なのかは知りません。(←だめじゃん…)

LIST=("AAA" "BBB" "CCC")

echo ${LIST[@]}
for VAL in ${LIST[@]}
do
    echo ${VAL}
done

echo "LIST NUM="${#LIST[@]} # 配列の要素数が取得できます。
for (( i = 0; i < ${#LIST[@]}; ++i ))
do
    echo ${LIST[$i]}
done

ファイルを読込んで1行づつ処理を行う - ※AWKを使っても制限はあり

配列ではなくファイルを読込み処理する場合は、AWKを使えばできますが、whileを使うほうが簡単ですのでそっちを使った方がいいです。

data.txtは以下のようになります。1レコードに空白などあると以下のコードだとダメです。

AAA.txt
BBB.txt
CCC.txt
# 最終行に空行が存在しなくても大丈夫
FILE_NAME="./data.txt"
FILE_LIST=`awk '{print $0}' < ${FILE_NAME}` # AWKで1行分読み込む

echo ${FILE_LIST} # 最後の行の値しか表示しないので紛らわしい。全部表示するにはどうすればいいのか?

for VAL in ${FILE_LIST}
do
    echo ${VAL}
done

----- OUTPUT -----
 CCC.txt
AAA.txt
BBB.txt
CCC.txt

空白があった場合
data.txt

AAA.txt 1
BBB.txt 2
CCC.txt 3

以下のように空白区切りで取り出されてしまいます。

 CCC.txt 3
AAA.txt
1
BBB.txt
2
CCC.txt
3


この記事が気に入ったらサポートをしてみませんか?