【问题标题】:Bizzarre Bash outputs奇怪的 Bash 输出
【发布时间】:2015-02-16 23:02:37
【问题描述】:

好的,这是我的第一个 bash 程序,我真的迷失了这个程序。 摘要测试需要 0-2 个参数并根据 cmp 退出状态返回“相同”或“不同”。

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

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

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

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

如果有 1 个参数 $1 保存所有 .out 和 .std 文件

如果有 2 个参数 $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

【问题讨论】:

  • 你能把你的脚本减少到重现问题所需的最低限度吗?另外,我建议您通过 shellcheck.net 运行您的脚本,因为该工具会捕获一些常见错误。
  • 也尝试使用bash -x yourscript.sh 进行一些调试。这将有助于显示变量。并查看:stackoverflow.com/questions/17804007/…
  • 我真的不知道如何减少这一点,因为这门课基本上是为了 0 经验的 shell 编程,但非常感谢你让我知道 shellcheck 和调试器,真的会帮助我理解以后的程序
  • 既然这真的是一个数据处理问题,不是一个管理问题,你会考虑使用 awk 脚本吗?对于初学者: ls *.out *.std | awk '...' 它使用关联数组,这是您的问题所需要的。你/你会考虑 awk 吗?
  • 当前目录中有哪些文件和目录*.out *.std

标签: bash shell


【解决方案1】:
# 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
}

【讨论】:

  • 我还测试了一个没有“set --”成语的解决方案;它更干净。
  • 这里有很多问题:parsing ls,缺少引号,使用expr。不用说,代码肯定坏了。
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2015-02-18
  • 2011-06-14
相关资源
最近更新 更多