0
#! /bin/sh

if [ $# -ne 2 ]
then
    echo "Invalid argument count."
    echo "Usage: $0 <dir1> <dir2>"
    exit
fi

ls $1 >> dir1


for file in $2/*
do
        grep $file $dir1
done

rm $dir1

我编写上面的脚本的目的是打印两个目录中的所有文件,这些文件的名称作为参数传递给脚本。

但是当我运行脚本时,它花了很长时间。(实际上从未完成!)

有谁碰巧知道我在这里做错了什么?

谢谢

4

2 回答 2

1

$dir1 未定义,因此 grep 只有一个参数,并在标准输入中搜索 $file。所以 grep 正在等待输入,它将永远等待。

于 2012-05-31T22:18:39.610 回答
0

我必须设置一个测试来确定,但你从来没有为 设置一个值$dir1,你只重定向 ls到一个名为dir1.

那么怎么样

#! /bin/sh

if [ $# -ne 2 ]
then
    echo "Invalid argument count."
    echo "Usage: $0 <dir1> <dir2>"
    exit
fi

ls $1 >> dir1


for file in $2/*
do
        grep $file dir1
done

rm dir1

当我得到一个没有明显预期输出的脚本时。我将其杀死,然后将 shell 调试功能添加到脚本中。

要么在顶部,比如

#!/bin/sh -vx

或者在脚本中我怀疑有问题的任何任意位置或在第二行,即

set -vx

或者,如果我很确定问题出在哪里,并且上面会产生很多需要滚动的东西,那么我会隔离可疑行,打开和关闭调试,即

set -vx
suspect_code
set +vx

最后,我认为您的问题可以简化为

ls $1 >> dir1
ls $2/* | fgrep -f dir1 

如果您的文件/目录嵌入了空格、CR 或其他令人讨厌的东西,这将受到限制。如果你有漂亮干净的文件名,它应该可以工作。

我希望这有帮助。

于 2012-05-31T22:08:59.853 回答