下記のようなシェルスクリプトを書きました。

「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
.
.
.

回答の条件
  • 1人5回まで
  • 登録:2009/07/10 21:39:57
  • 終了:2009/07/12 22:16:45

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402009/07/10 22:54:31

ポイント40pt

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

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
id:quecksilber

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

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

2009/07/12 22:08:25
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/07/10 22:19:21

ポイント40pt

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

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

#!/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
id:quecksilber

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

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

2009/07/12 22:12:44
id:pyopyopyo No.3

pyopyopyo回答回数357ベストアンサー獲得回数882009/07/12 20:39:42

ポイント100pt
ssh $HOSTn ifconfig -a | awk ..

の部分を

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

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


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

id:quecksilber

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

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

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

2009/07/12 22:15:26
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402009/07/12 22:15:11

ポイント10pt

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

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


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

  • id:b-wind
    >Bashってこういうifの書き方できましたっけ
    無理。
    [ って test コマンドのエイリアスだから。
    bash は内部コマンドだけど、/bin/[ ってコマンドもあるんよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません