【初学者向け】Bashで変数を使いこなしたい ~for,while編~


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

 

for文、while文はともに処理を繰り返し行いたい時に使いますが、
それぞれ繰り返す条件が異なります。

for文の構造

 

for文の基本的な構造は以下のような形になります。

for 変数 in リスト; do
    処理文
done

「変数」に、指定した「リスト」の値が1個ずつ順番に代入されていき

全て読み込んだ時にfor文が終了します。

while文の構造

 

for文の基本的な構造は以下のような形です。

while 条件式
do
  繰り返し処理
done

条件式に書いた内容が当てはまるとき処理を繰り返します。
ここの条件式にはif文を適用することも可能です。

 

簡単にまとめると

 

if文  :指定したリストの分繰り返す(ある程度繰り返す回数が決まっているとき)
while文:条件式によって繰り返す(条件が偽になるまで繰り返したいとき)

 

のようなイメージでとらえるとよいかと思います!

 

実際触ってみる(for文)

 

では実際にスクリプトから結果を見ていきたいと思います。

 

■検証環境
・VMware Workstation 16 player上のRHEL8.4にて
・forwhiledemo.shという名前のファイルを事前作成済み

 

実演1

 

[root@localhost ~]# cat forwhiledemo.sh
#!/bin/bash

for i in 1 2 3
do
echo $i  
done

 

[root@localhost ~]# bash forwhiledemo.sh
1
2
3

 

これが基本的な構文になりますが、次にテキストファイルを作成して
その中から条件に当てはまるものを抽出してみます。

 

実演2

まず適当にファイルを作成します。

 

[root@localhost ~]# cat demo2.txt
1
2
3
4
5
6
7
8
9
10

次に、ファイルに対して適用するシェルスクリプトを作成します。

 

[root@localhost ~]# touch demo2.sh
#!/bin/bash

for line in `cat demo2.txt`; do echo $line
done;
[root@localhost ~]# bash demo2.sh
1
2
3
4
5
6
7
8
9
10

ここまでで、for文を適用したいテキストファイルと
作成したスクリプトが適用されているのが確認できました。

 

今のままでは単純に1行ずつ反映させているだけなので、
ここから1という文字が含まれている行のみ抽出していきたいと思います。

 

実演3

#!/bin/bash

for i in 1
do
cat demo2.txt | grep "$i"
done

 

先ほどのファイルを上のように書き換えて実行します。

 

[root@localhost ~]# bash demo2.sh
1
10

先ほどは1から10までの数字が反映されていたのが、
今回は1と10のみ反映されています。

 

forコマンドにオプションはないため使い方としては以上ですが、
このスクリプトをlsファイルで表示された一覧全てのファイルに反映させたりと
いろいろ使い方によっては便利になる文です。

 

実際触ってみる(while文)

 

ここからはwhile文で検証してみたいと思います。

 

実演1

まず先ほどと同じテキストファイルの内容を1行ずつ抽出してみます。

 

[root@localhost ~]# touch whiledemo3.sh
#!/usr/bin/bash

while read line
do
  echo $line
done < demo2.txt
[root@localhost ~]# bash whiledemo3.sh
1
2
3
4
5
6
7
8
9
10

こちらも先ほど同様に1行ずつ抽出できました。

 

while文でファイルを読み込む場合は、
「read line」
を指定して、doneのあとに
「>ファイル名」で読み込むファイルを指定します。

 

実演2

 

while文では、条件の終了コードが0の間は繰り返し処理をするため、
無限ループの状態を作成することが可能です。

 

構文はこちらになります。

 

while true; do
    処理
done

「true」コマンドは、終了ステータスを0で返します。

 

これを使うと、時刻を1秒ごとに表示することも可能です。

 

先ほどのスクリプトを書き換えて実行してみます。

while true; do
    date
    sleep 1
done
[root@localhost ~]# bash whiledemo3.sh
Mon Aug 21 23:01:24 PDT 2023
Mon Aug 21 23:01:25 PDT 2023
Mon Aug 21 23:01:26 PDT 2023
Mon Aug 21 23:01:27 PDT 2023
Mon Aug 21 23:01:28 PDT 2023
Mon Aug 21 23:01:29 PDT 2023
Mon Aug 21 23:01:30 PDT 2023
Mon Aug 21 23:01:31 PDT 2023

 

時刻が1秒ごとに表示されました。

 

まとめ

Linuxはインフラに携わるうえで必須になってくるので
自分が実装したい仕組みはどのように構築するか、
なんのコマンドを組み合わせれば実現可能なのか。
トラブルの際に落ち着いて仕組みから問題解決できたり分析できる
エンジニアになるために基礎をどんどん固めていきたいですね!

Last modified: 2023-08-22

Author