奇怪的Bash输出

时间:2015-02-16 23:02:38

标签: bash shell

好吧,这是我的第一个bash程序,我真的迷失了这个。 摘要测试需要0-2 args并返回'same'或'different',具体取决于cmp退出状态。

我要做的是将所有.out放入一个变量中,将所有.stds放在另一个变量中。然后我想迭代出现的两个变量:

如果我有一个.out但不是.std的同一个基本名称,我想打印'missing file.std'

如果我有所有对应的file.out和file.std文件包含相同的内容我返回'所有案例都通过'

如果cmp失败,我会计算它失败的次数(即file.out和file.std不同的次数)

如果有1个参数,则$ 1包含所有.out和.std文件

如果有2个args $ 1持有.out和$ 2持有.std

否则我们使用当前目录

我遇到的问题是我的输出很奇怪。 我的0 arg输出就像./file不同 我的1个arg输出是file.out./* 而我的arg 2说缺少file.out / * .std 有谁知道发生了什么事?

T=*.out
S=*.std
if [[ $# = 1 ]]; then
   T=$1
   S=$1
fi
if [[ $# = 2 ]]; then
   T=$1
   S=$2
fi

N=0
fin=0
for i in $T/*; do
 count=0
 for j in $S/*; do
     if [[ ${i%.out} = ${j%.std} ]]; then
        if cmp -s $i $j; then
             echo ${i%.out} same
        else
             let N=$N+1
             echo ${i%.out} different
        fi
     else
         let count=$count+1
         if [[ $count=${#y} ]]; then
               let fin=$count
               F=${i%.out}.std
         fi
      fi
   done
done

if [[ $fin = 0 ]]; then
   if [[ N = 0 ]]; then
      echo all tests succeeded
   else
      echo $N tests failed
   fi
else
   echo missing file: $F
fi

1 个答案:

答案 0 :(得分:0)

# copy to file: sameOrDiff, chmod +x sameOrDiff
# run:  $ sameOrDiff out std
# this will get you started, modify for your 
# precise output requirements
x=$1; y=$2
ls *.$x *.$y |
sed 's/\.[^\.]*$//' | sort -u | {
    nc=0
    while read a;
    do
        f=$a.$x
        g=$a.$y
        # echo $a $f $g
        set -- $(ls $f $g 2> /dev/null )
        # echo $# $*
        [[ $# -eq 2 ]] && {

                cmp $@ >/dev/null || { nc=$(expr $nc + 1); }

            } || {

                [[ -f $f ]] && { echo missing $g; }
                [[ -f $g ]] && { echo missing $f; }
            }
    done
    [[ $nc -lt 1 ]] && echo all cases passed
    echo NC $nc
}