1

问题:脚本将接收任意数量的文件名作为参数。脚本应该检查提供的每个参数是文件还是目录。如果目录报告。如果是文件,则应报告文件名加上其中存在的行数。

下面是我的代码,

#!/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 是命令行参数。

好心劝告。

4

1 回答 1

3

那是wc命令的输出。例如:

$ wc -l file1
1 file1

但是,如果您stdin从另一个命令重定向file1或通过管道将其导入,则它不会为您提供文件名。stdoutwc

$ 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$@代替$*.

于 2013-10-27T07:30:03.447 回答