2016-05-22 5 views
0

の場合、望ましくない結果以下は、私が以下のunixスクリプトを適用しているファイルです。条件が

0.30 2.30 - - - - - - - 
    2.30 3.30 - - NA NA - - - 
    3.30 4.30 - - NA NA - - - 
    4.30 5.30 - - - - - - - 
    5.30 6.30 - - NA NA - - - 
    6.30 0.30 - - - - - - - 

##Time=`echo $(date) | awk -F ' ' '{print $4}' | awk -F ':' '{print $1}'` 
Time=05; 
Result="False"; 
while [[ "${Result}" != "True" ]] 
do 
    while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 
    do 
     if [[ "${Time}" -ge "${f1}" && "${Time}" -le "${f2}" ]] 
     then 
       echo $Time is between $f1 $f2 True 
       Result="True"; 
     else 
       echo $Time is between $f1 $f2 False 
     fi 
    done < consolidated.txt 
done 

私は以下の結果を得ています:if条件が2回満たされていることに注意してください。 05は5.30から6.30の間ではありませんが、それでもtrueを返します。 私はここで何が欠けています。

05 is between 0.30 2.30 False 
05 is between 2.30 3.30 False 
05 is between 3.30 4.30 False 
05 is between 4.30 5.30 True 
05 is between 5.30 6.30 True 
05 is between 6.30 0.30 False 
+1

これはどの言語ですか? – Laurel

+0

これはkshのスクリプト – user3055262

+1

私たちはそのためのタグを持っています。最初に質問を投稿するときは、これらの重要なすべての詳細を含める必要があります。 – Laurel

答えて

1

種々の問題が表示されている:コード内

  • 外側のループは問題があります。 consolidated.txtの時間範囲のいずれも一致しない場合、${Result}Falseのままであり、外側のループは決して終了しません。
  • データの最後の時間範囲である6.30 0.30は、範囲の終わりが範囲の開始よりも数値的に小さいため、決して一致することはありません。
  • 条件でtime >= start && time <= endを使用している場合、時間値が5.30の場合は、4.30 5.30の範囲(終了時刻と同じ)と5.30 6.30の範囲(開始時刻と同じ)の両方に一致します。

Bashとは異なり、Kornシェルは浮動小数点演算をサポートしているので便利です。代わりに[[ … ]]

と文字列の比較(-ge-le)を使用して、あなたは((…))と(浮動小数点)数値比較(>=<)を使用する必要があります。

単一のスクリプトにこれらの変更を組み立て、そしてそれはここでは関係ないのでResult変数を無視して、あなたが得る:

#!/bin/ksh 

for Time in 0 3 05 5.30 7.00 
do 
    while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 
    do 
     if (("${Time}" >= "${f1}" && "${Time}" < "${f2}")) 
     then echo "${Time} is between ${f1} and ${f2} True" 
     else echo "${Time} is between ${f1} and ${f2} False" 
     fi 
    done << EOF 
    0.30 2.30 - - - - - - - 
    2.30 3.30 - - NA NA - - - 
    3.30 4.30 - - NA NA - - - 
    4.30 5.30 - - - - - - - 
    5.30 6.30 - - NA NA - - - 
    6.30 24.00 - - - - - - - 
EOF 
done 

はい、ここでは文書の最後にEOFをする必要がありません左マージンに。インデントが空白ではなくタブである限り、<<-'EOF'を使用し、末尾マーカーEOFをインデントすることができます。

このスクリプトの出力は次のようになります。

… 
5.30 is between 3.30 and 4.30 False 
5.30 is between 4.30 and 5.30 True 
5.30 is between 5.30 and 6.30 True 
5.30 is between 6.30 and 24.00 False 
… 

付:

0 is between 0.30 and 2.30 False 
0 is between 2.30 and 3.30 False 
0 is between 3.30 and 4.30 False 
0 is between 4.30 and 5.30 False 
0 is between 5.30 and 6.30 False 
0 is between 6.30 and 24.00 False 
3 is between 0.30 and 2.30 False 
3 is between 2.30 and 3.30 True 
3 is between 3.30 and 4.30 False 
3 is between 4.30 and 5.30 False 
3 is between 5.30 and 6.30 False 
3 is between 6.30 and 24.00 False 
05 is between 0.30 and 2.30 False 
05 is between 2.30 and 3.30 False 
05 is between 3.30 and 4.30 False 
05 is between 4.30 and 5.30 True 
05 is between 5.30 and 6.30 False 
05 is between 6.30 and 24.00 False 
5.30 is between 0.30 and 2.30 False 
5.30 is between 2.30 and 3.30 False 
5.30 is between 3.30 and 4.30 False 
5.30 is between 4.30 and 5.30 False 
5.30 is between 5.30 and 6.30 True 
5.30 is between 6.30 and 24.00 False 
7.00 is between 0.30 and 2.30 False 
7.00 is between 2.30 and 3.30 False 
7.00 is between 3.30 and 4.30 False 
7.00 is between 4.30 and 5.30 False 
7.00 is between 5.30 and 6.30 False 
7.00 is between 6.30 and 24.00 True 

は、あなたが質問が使用するものと同じです<=から<条件、変更する場合は、出力を得ます最後の範囲は6.30 0.30となり、出力の最終部分は次のようになります。

… 
7.00 is between 5.30 and 6.30 False 
7.00 is between 6.30 and 0.30 False 
+0

[[...]]と((...))を区別していただき、ありがとうございます。スクリプトを編集したところ、正常に動作しているようです。 :) – user3055262

1

あなたが持っている問題はTime=05; kshが浮動小数点値としてこれを解釈していないラインによるものです。 letはそれを強制するでしょう。

$ Time=05;echo $Time 
05 
$ let Time=05;echo $Time 
5 

他の一般的なイディオムはここTime=$(echo $Time |bc)

であるあなたのロジックのための代替言い回しです:

$echo $Time $f1 $f2 
05 5.30 6.30 
$ 
$let Time=05  
$ if [[ (($Time > $f1)) && (($Time < $f2)) ]] 
> then 
>  echo $Time is between $f1 $f2 True 
> else 
>  echo $Time is between $f1 $f2 False 
>fi  
5 is between 5.30 6.30 False 

((...))はそれがifで使用するために設計されて[[ ... ]]
に似た数値の条件でありますおよびwhileの構築物。

hereは、「Kornシェルの学習」のセクション6.2.2に記載されています。