2016-04-18 5 views
0

私は最初のbashスクリプトを試しています。別のスクリプトを使っていくつかのファイルを実行して答えを確認しています。なぜこのbashスクリプトは常に偽を評価していますか

for i in tests/*; 
do 
    if [ "${i: -2}" != ".a" ] ; then 
    A=`cat "$i" | python3 blah.py` 
    B=`cat "$i.a"` 
    if (("$A" == "$B")); then 
     printf "Passed $i\n\n" 
    else 
     echo "Failed $i:" 
     echo "Calculated Answer: $A" 
     printf " Correct Answer: $B\n\n" 
    fi 
    fi 
done 

そして、それは私が取得する方法私の混乱の周りに、このスクリプトと関係なく思えるような出力:私の計算の答えが与えられた答えと同じになりますが、スクリプトは、私が言うだろう

Failed tests/23: 
Calculated Answer: 33334 
    Correct Answer: 33334 

失敗しました。

+2

いくつかの非印字文字がある場合があります。あなたの出力を 'hexdump'などでパイプして、それが起こっているかどうか確認してください。 – paddy

答えて

0

私のために働いたので、おそらくあなたのバージョンのbashを注意してください。私はOSXの上にいる:

bash --version 
> GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14) 
> Copyright (C) 2007 Free Software Foundation, Inc. 
A="1" 
B="1" 
if (("$A" == "$B")); then 
    printf "Passed $i\n\n" 
else 
    echo "Failed $i:" 
    echo "Calculated Answer: $A" 
    printf " Correct Answer: $B\n\n" 
fi 
> Passed 
A="1" 
B="2" 
if (("$A" == "$B")); then 
    printf "Passed $i\n\n" 
else 
    echo "Failed $i:" 
    echo "Calculated Answer: $A" 
    printf " Correct Answer: $B\n\n" 
fi 
> Failed : 
> Calculated Answer: 1 
> Correct Answer: 2 

目立つものは、パランスです。私は通常、if、just []、[[]](文の中のスペース)には()を使用しません。以前の/ bin/sh環境との下位互換性があるかもしれないので、[]を使うだけであれば、それはいつか分かりません。しかし、それらを交換してみてください。また、printf?私は正直に、あなたがそれを使うことができるかどうかわからなかった、私はいつもエコーを使った。 :)まあ、それは動作します:

if [[ "$A" == "$B" ]]; then 
    printf "Passed $i\n\n" 
else 
    echo "Failed $i:" 
    echo "Calculated Answer: $A" 
    printf " Correct Answer: $B\n\n" 
fi 

は、上記を試してみてください、と私たちはあなたが使っているbashの/ shを/他のインタプリタのバージョンをお知らせください。

+3

'printf'は明確に定義され標準化されているので、' echo'よりもはるかに優先されます。ラウンドカッコは算術評価専用です。 '[' 'は一般的な移植可能な' 'テスト' '[[' 'はBash拡張です。 – tripleee

+0

興味深いことに、毎日新しいことを学ぶ。いい物。 –

関連する問題