shell 的一个判断问题请教

中山野鬼 发布于 2013/08/06 22:50
阅读 246
收藏 1

判断文件是否存在,用-f就可以了。但是我想判断一个目录下,是否有.c后缀的文件,只要有就行,而不是特指某个具体的文件,貌似 if [ -f .... 搞不定,现在我只能

LIST=`ls $1`

然后判断 LIST 是否为空串,总觉得这样做有点绕,是否有直接的方案?

加载中
0
leo108
leo108

if [ -f *.c ]; then

fi

0
alexchen
alexchen
LIST=$(find $(pwd) -type f -name '*.c')
0
中山野鬼
中山野鬼

引用来自“leo108”的答案

if [ -f *.c ]; then

fi

我用变量放进去,发现不行。
0
中山野鬼
中山野鬼

引用来自“alexchen”的答案

LIST=$(find $(pwd) -type f -name '*.c')
这个,这个,貌似比ls打一下更复杂。。
中山野鬼
中山野鬼
回复 @alexchen : 我传入进去就是*.c,测试过了,不行哦。
alexchen
alexchen
回复 @中山野鬼 : 你的$(FILE) 可能有很多的元素 导致if有很多参数的错误。FILE=$(*.c) 我的意思就是只要有一个匹配的c文件,就把它赋值给FILE最后就看这个文件是否存在。
中山野鬼
中山野鬼
回复 @alexchen : 你的 if [ -e ($FILE) ] 的写法刚试了,写法错误。哈。
alexchen
alexchen
要是只要得出有没有.c的文件那就试试: CFILE=(*.c) if [ -e $CFILE ]; then echo "Find C file..........." fi
0
屈能荣
屈能荣

你喜欢用ls是吧,很容易:

ls ${path_dir}/*.c 
echo $?  ##结果非0说明不存在
你可以直接在ls过后,就用 if [ $? == 0] 的方式进行检验;

0
中山野鬼
中山野鬼

引用来自“屈能荣”的答案

你喜欢用ls是吧,很容易:

ls ${path_dir}/*.c 
echo $?  ##结果非0说明不存在
你可以直接在ls过后,就用 if [ $? == 0] 的方式进行检验;
不是喜欢不喜欢的问题。是问是否有什么直接的方式来检测,而不是这种通过调用其他命令的方式。ls find 等都不是直接实现。
徐庆-neo
徐庆-neo
不去查询或者枚举,肿么知道有没有。if 是内建的命令,里面的实现也无非就是枚举排列查找罢了...
0
中山野鬼
中山野鬼

@alexchen ,试过了,无用,一开始是我自己拼写错误。


0
m
mononite

对Shell的Glob工作机制有了解的话,可以按下面的步骤试试:

1)[ "*.c" ]:思路很简单,Shell把*.c展开,如果存在c文件,那字符串肯定不为空,如果不存在,字符串为空。但这种方式是错误的,因为在不存在c文件时,Shell返回的值是"*.c"而不是空串。

2) [ "$(shopt -s nullglob; echo *.c)" ]:通过shopt设置nullglob,在没有c文件时就会返回空。这种方法可以工作。

3) [ -e "$(printf *.c)" ]:不设置nullglob的话,可以考虑用-e来判断文件是不是真存在,printf只会返回第一个文件或者*.c。这种方法也可以工作。

一般情况下,2)和3),包括其他用ls的方法都没问题,但如果目录下c文件太多或者有文件名很长,这些用Glob给命令传参数的方法有可能会失败。所以最健壮的方法还是用find命令:[ "$(find . -maxdepth 1 -name '*.c' -print -quit)" ] 。

0
中山野鬼
中山野鬼

引用来自“mononite”的答案

对Shell的Glob工作机制有了解的话,可以按下面的步骤试试:

1)[ "*.c" ]:思路很简单,Shell把*.c展开,如果存在c文件,那字符串肯定不为空,如果不存在,字符串为空。但这种方式是错误的,因为在不存在c文件时,Shell返回的值是"*.c"而不是空串。

2) [ "$(shopt -s nullglob; echo *.c)" ]:通过shopt设置nullglob,在没有c文件时就会返回空。这种方法可以工作。

3) [ -e "$(printf *.c)" ]:不设置nullglob的话,可以考虑用-e来判断文件是不是真存在,printf只会返回第一个文件或者*.c。这种方法也可以工作。

一般情况下,2)和3),包括其他用ls的方法都没问题,但如果目录下c文件太多或者有文件名很长,这些用Glob给命令传参数的方法有可能会失败。所以最健壮的方法还是用find命令:[ "$(find . -maxdepth 1 -name '*.c' -print -quit)" ] 。

确实这样,所以昨天,直接搞了个偷懒的方式,赶快应付掉了。
返回顶部
顶部