问题:脚本将接收任意数量的文件名作为参数。脚本应检查提供的每个参数是否是文件或目录。如果目录报告。如果是file,则应报告该文件的名称加上其中的行数。
以下是我的代码,
#!/bin/sh
for i in $*; do
if [ -f $i ] ; then
c=`wc -l $i`
echo $i is a file and has $c line\(s\).
elif [ -d $i ] ; then
echo $i is a directory.
fi
done
输出:
shree@ubuntu:~/unixstuff/shells$ ./s317i file1 file2 s317h s317idir
file1 is a file and has 1 file1 line(s).
file2 is a file and has 2 file2 line(s).
s317h is a file and has 14 s317h line(s).
我的问题:变量c的值在每次迭代时都是1 file1,2 file2,14 s317h。而我想要它1,2和14.为什么它包含前值而不是后者?我哪里错了?
注意:s317i是我的文件名,file1 file2 s317h和s317idir是命令行参数。
请提供建议。
答案 0 :(得分:3)
这是wc
命令的输出。例如:
$ wc -l file1
1 file1
但是,如果您将stdin
从file1
重定向或将另一个命令的stdout
传送到wc
,那么它就不会为您提供文件名。
$ wc -l < file1
1
$ cat file1 | wc -l
1
因此,您的脚本应如下所示:
#!/bin/bash
for arg in $@; do
if [ -f $arg ]; then
echo $arg is a file and has `wc -l < $arg` lines.
elif [ -d $arg ]; then
echo $arg is not a file, it is a directory.
fi
done
请注意,我使用bash
代替sh
和$@
代替$*
。