找回密码
 注册
查看: 1082|回复: 4

[shell开发]使用[ -f file ]判断是否是文件

[复制链接]
发表于 2005-10-18 19:48:44 | 显示全部楼层 |阅读模式
没有找到关于shell开发的板块,所以写在这里。
我的原题是统计一个目录下的文件个数和目录个数。我写的程序如下:
#!/bin/bash
fsum=0
dsum=0
# $1是我要统计的目录,由调用时作为参数传递
for var in $(ls $1)
do
   if [ -f $var ];then
      fsum=$(($fsum+1))
   elif [ -d $var ];then
      dsum=$(($dsum+1))
   else
       :
    fi
done
echo "the total file number is $fsum"
echo "the total directory number is $dsum"
exit 0

可是我发现程序根本就不会进入if和elif子句中,但是如果$1=/root,就可以,其他的都不可以。
是不是使用[ -f file ]判断中的file变量不能由一个代表文件名的字符串来表示?
当然使用文件名的通配符也可以实现。但是我就想知道这样做不行的原因,如何改?
谢谢!
希望得到大家的指点。
发表于 2005-10-18 23:24:25 | 显示全部楼层
很明显了,$var只是个字符串,当然没有文件或者目录的属性了,你用/root,因为/表示了根目录,OK,他才可以判断到属性啊,下面是我改的,可以参考一下,如果要用到更方便,还要改的,呵呵,我也是初学者:)
[code:1]
#!/bin/bash
fsum=0
dsum=0
for var in $(ls $1)
do
if [ -f './'$1'/'$var ];then
fsum=$(($fsum+1))
elif [ -d './'$1'/'$var ];then
dsum=$(($dsum+1))
else
:
fi
done
echo "the total file number is $fsum"
echo "the total directory number is $dsum"
exit 0
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-10-19 23:08:39 | 显示全部楼层
感谢给我解答。
但是,我用你的程序试了一下,还是不对啊。
1.
你用/root,因为/表示了根目录,OK,他才可以判断到属性啊

说明一下,我用/etc等目录也试过,也不对。

2.我试验了一个简单的程序:
#!/bin/bash
var="linux_for.sh"
if [ -f $var ];then
   echo "ok"
else
  echo "no"
fi
exit 0

当然,linux_for.sh确实是一个在当前目录下存在的文件名。
结果是"ok"
我只是拿这个例子想说 用一个代表文件名的字符串就可以直接判断是否是文件。
毕竟,shell下就字符串和整数两种数据类型

期待解答!
多谢!
回复

使用道具 举报

发表于 2005-10-20 01:10:56 | 显示全部楼层
是可以判断啊,但是你的脚本里没有给路径啊,我就是把$1加到$var前面去了,这样脚本才能找到你要查询的目录和文件啊,呵呵。

if 里面这样写就可以了,我试过的,没问题:)
[code:1]
if [ -f $1/$var ]
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-10-20 17:20:21 | 显示全部楼层
谢谢楼上仁兄。
呵呵在你的帮助下终于明白了。确实就是路径的事。
因为$(ls $1)仅仅得到文件名,是相对路径。
我如果直接用
[ -f $var ]等于不是判断我提供的目录下的文件,而是判断当前目录下的文件。

除了你提供的方法外,还可以
在循环之前加
cd $1
这样,判断时就直接使用[ -f $var ]。

再次感谢你再次的帮助!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-7 19:48 , Processed in 0.025455 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表