shell用户变量的差异

时间:2013-10-27 07:12:50

标签: linux bash shell

问题:脚本将接收任意数量的文件名作为参数。脚本应检查提供的每个参数是否是文件或目录。如果目录报告。如果是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是命令行参数。

请提供建议。

1 个答案:

答案 0 :(得分:3)

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

$ wc -l file1
1 file1

但是,如果您将stdinfile1重定向或将另一个命令的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$@代替$*