2012年4月30日星期一

Linux上のbashシェルでの実数比較 (ファイルから読み込んだ値)がうまくいきません.

Linux上のbashシェルでの実数比較 (ファイルから読み込んだ値)がうまくいきません.

Linux(OpenSuse11.4)上のbashでシェルを組み,

数値データを書いたファイルを読み込んである値と実数の値を比較し,

条件分岐するというプログラムを作りたいのですが,



「(standard_in) 1: illegal character: ^M」



というエラーが出て、上手く比較が行うことができません.



以下,シェルプログラム



#!/bin/sh

i=1

while read dum

do

bc[$i]=$dum

i=`expr $i + 1`

done < bc_last.dat

step=1

max=10000.0

x=`echo "scale=15;if( ${bc[15]} < 10000.0 ) 1 else 0" | bc`

echo x= $x

if [[ $x -eq 1 ]] ; then

dis=`echo "scale=15; ${bc[15]}*${step}/${ndiv}"| bc`

echo $dis > bc.dat

else

echo ${bc[15]} >> bc.dat

fi

exit 0



読み込むファイルはこんなのです

「bc_last.dat」

tetrafile

cube2.grid.am

surfacefile

cube2.surf

pressure

.0000000

edge

0.0

0.9

0.0

0.9

0.0

0.9

distance

10000

10000

10000

10000

10000

10000

10000

10000

10000

10000

10000

10000

0.0

0.0

0.0

10000

10000

1.0



なお、値をファイルから読むのではなくシェル上で代入した場合にはエラーもなくうまく行うことができました.

また、Linux上ではなく、Cygwin上で実行するとうまくいきました.Linuxのbashと何が違うのでしょうか・・?



どうすればうまくプログラムを実行できるのでしょうか。どうか教えてい頂きますようお願い申し上げます.







Cygwinでは改行コードがCR+LFなのですがLinuxではLFのみです。

CR=^Mなのでそれを取り去ればいいわけですね。

取り去る方法としては

nkf -Lu bc_last.dat > lc_last.lf.dat

という風にするとlc_last.lf.datには^m(CR)がなくなりますのでこれを読み込めばうまく行くんじゃないでしょうか?

没有评论:

发表评论