人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記のようなシェルスクリプトを書きました。
「ID: ホスト名 IP」という書式のリストが作成されると言う意図なのですが、どうしても読み込んだリストの一番最初のレコードしか記録されず悩んでいます。
どうすればよいのでしょうか、おしえてください。環境はCentOS5.3 / Bash3.2のようです。

コード

#!/bin/bash

LIST=/foo/bar/list.txt
echo -n > /foo/bar/test.dat
_CNT=0

while read line;
do
if [[ "$line" =~ "^[^#]" ]] ; then
HOSTn=`echo $line | awk '{print $1}';`
ADDR=`ssh $HOSTn ifconfig -a | awk '/(cast)/ { print $2 }' | cut -d':' -f2 | head -1`

if [ "$ADDR" != "" ] ; then
echo "$_CNT: $HOSTn $ADDR" >> /foo/bar/test.dat
fi
fi
_CNT=`expr $_CNT + 1`

done < $DBLIST

list.txtの内容(#はコメントアウトとして扱う)

host1
host2
host3
# host4
host5
host6
.
.
.

●質問者: quecksilber
●カテゴリ:コンピュータ インターネット
✍キーワード:AWK BAR bash dat ECHO
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● b-wind
●40ポイント

ふーむ、処理内容の細かいところは見てないけど、ざっと見はループ処理は出来てるように見えるね。

DBLIST と LIST が違ってるのは typo かな?


エラーメッセージを出すようにすればもう少し原因がつかめると思う。

#!/bin/bash

DBLIST=/foo/bar/list.txt
echo -n > /foo/bar/test.dat
_CNT=0

while read line; do
 if [[ "$line" =~ "^[^#]" ]] ; then
 HOSTn=`echo $line | awk '{print $1}';`
 ADDR=`ssh $HOSTn ifconfig -a | awk '/(cast)/ { print $2 }' | cut -d':' -f2 | head -1`

 if [ "$ADDR" != "" ] ; then
 echo "$_CNT: $HOSTn $ADDR" >> /foo/bar/test.dat
 else 
 echo "$_CNT: $HOSTn can't get address" 1>/dev/null 1>&2
 fi
 fi
 _CNT=`expr $_CNT + 1`
done < $DBLIST
◎質問者からの返答

すみません、$DBLISTのところを合わせるの忘れていました。

肝心の結果ですが、やはり同じように最初のレコードしか記録されませんでした。エラーという感じではないので、どこか勘違いしたところがあるのかもしれません‥。


2 ● pahoo
●40ポイント

変数、セミコロン、条件式の使い方がおかしい気がします。

下記のスクリプトでどうでしょう?

#!/bin/bash

DBLIST=./list.txt
echo -n > test.dat
_CNT=0

while read line
do
 if "$line" =~ "^[^#]"
 then
 HOSTn=`echo $line | awk '{print $1}';`
 ADDR=`ssh $HOSTn ifconfig -a | awk '/(cast)/ { print $2 }' | cut -d':' -f2 | head -1`
 if "$ADDR" != ""
 then
 echo "$_CNT: $HOSTn $ADDR" >> test.dat
 fi
 fi
 _CNT=`expr $_CNT + 1`
done < $DBLIST
◎質問者からの返答

Bashってこういうifの書き方できましたっけ、と思って検証してみたのですが、やはり9行目のifで読み込んだ内容がコマンド展開されてしまい実行されてエラーとなってしまいました。

ただ、読み込んだ内容が来ているのであと一歩かなと思いました。


3 ● pyopyopyo
●100ポイント
ssh $HOSTn ifconfig -a | awk ..

の部分を

ssh $HOSTn ifconfig -a < /dev/null | awk ..

に書き換えると動くと思います。


"< /dev/null" が無いと、sshにDBLISTの2行以降が取られてしまいます。

◎質問者からの返答

ずばりこれが当てはまりました!

標準入力を取らないとパイプのさきに送れないのですね。

ありがとうございます、勉強になりました。


4 ● b-wind
●10ポイント

肝心の結果ですが、やはり同じように最初のレコードしか記録されませんでした。

いや、処理は変えてないから記録されてないのはいいんだけど、なんかエラーメッセージでてない?


っていうか ADDR 変数に突っ込んでるコマンド直接打ち込んでみた方が早いと思うんだけど。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ