Unix全般 -> シェル -> Bash

while 構文例

基本的な構文例

パラメータファイルを整形して表示する。


--- Shell 構文 ---

#!/bin/sh
$ while read line
do
  echo $line
done<./param.txt

 ※解説:テキストファイル "./param.txt" を1行づつ読み込む。
     行の内容は、変数 line に代入される。
  

--- 標準出力内容 ---
samba01,LINUX,192.168.0.203
ldap01,LINUX,192.168.0.218
nt01,WIN,192.168.0.3
dns01,SOLARIS,192.168.0.12
gw01,WIN,192.168.0.1

パラメータファイルを整形して表示する。カラムデータを変数に使用する場合。


--- Shell 構文 ---

#!/bin/sh
$ sed 's/,/ /g'  ./param | while read HOST TYPE IP
do
    echo "HOST is " $HOST
    echo "TYPE is " $TYPE
    echo "IP   is " $IP
done

 ※解説:テキストファイル "./param.txt" 内のセパレータ記号,(カンマ)を 
     sed で 空白に変換し各カラムのデータが HOST TYPE IP 変数に代入される。
  

--- 標準出力内容 ---
HOST is  samba01
TYPE is  LINUX
IP   is  192.168.0.203
HOST is  ldap01
TYPE is  LINUX
IP   is  192.168.0.218
HOST is  nt01
TYPE is  WIN
IP   is  192.168.0.3
HOST is  dns01
TYPE is  SOLARIS
IP   is  192.168.0.12
HOST is  gw01
TYPE is  WIN
IP   is  192.168.0.1

パラメータファイルを整形して表示する。セパレータ定義変数を使用する場合。


--- Shell 構文 ---

#!/bin/sh
$ IFS=,
$ cat ./param | while read HOST TYPE IP
> do
>    echo "HOST is " $HOST
>    echo "TYPE is " $TYPE
>    echo "IP   is " $IP
> done

 ※解説:セパレータ定義変数 IFS に ,(カンマ) を設定することにより
     そのまま各カラムのデータが HOST TYPE IP 変数に代入される。
  

--- 標準出力内容 ---
HOST is  samba01
TYPE is  LINUX
IP   is  192.168.0.203
HOST is  ldap01
TYPE is  LINUX
IP   is  192.168.0.218
HOST is  nt01
TYPE is  WIN
IP   is  192.168.0.3
HOST is  dns01
TYPE is  SOLARIS
IP   is  192.168.0.12
HOST is  gw01
TYPE is  WIN
IP   is  192.168.0.1

while内部での変数使用時の注意点

  パイプ(|)及びリダイレクト(<)を使用する場合 while 内の処理はサブシェルで実行される為、
  内部で設定した変数は無視されてしまう。

パイプ(|)、リダイレクト(<)を使用しない例

--- Shell 構文 ---

#!/bin/sh
CNT=0
while [ $CNT -lt 10 ]; do
  CNT=`expr $CNT + 1`
done
echo "Count=$CNT"

実行結果
Count=10

変数値がクリアされる例1。(|)パイプ使用

--- Shell 構文 ---

#!/bin/sh
CNT=0
cat ./param | while read line; do
  echo $line
  CNT=`expr $CNT + 1`
done
echo "Count=$CNT"

実行結果
Count=0   カウントされない

変数値がクリアされる例2。(<)リダイレクト使用

--- Shell 構文 ---

#!/bin/sh
CNT=0
while read line; do
  CNT=`expr $CNT + 1`
  echo $line
done<./param
echo "Count=$CNT"

実行結果
Count=0   カウントされない

対応策 ダミー出力を使用する

--- Shell 構文 ---

#!/bin/sh
CNT=0
exec 3<&0 < ./param  標準出力をダミー出力3にリダイレクトし、
                     ダミー出力3にファイルを読み込ませる。
while read line; do
  CNT=`expr $CNT + 1`
  echo $line
done
exec 0<&3 3<&-  ダミー出力3を標準出力にリダイレクトし、
                ダミー出力3を閉じる
echo "Count=$CNT"

実行結果
Count=5

* ダミー出力の数字は3-9が使用できる。

      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google