【发布时间】: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?