免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2416 | 回复: 13
打印 上一主题 下一主题

[文件目录] 简单问题,新手求教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-26 09:24 |只看该作者 |倒序浏览
本帖最后由 zehn_w 于 2012-07-26 13:44 编辑

内容很简单,判断指定目录下文件是否存在且是否是目录,然后做拷贝操作。
shell如下:
  1. #!/bin/sh

  2. if [ -z "$(ls /opt/updata/camera_th/)" ]
  3. then
  4.         if [ -d "$(/opt/updata/camera_th/)"]
  5.         then
  6.         cp /opt/updata/camera_th/ /opt/ -r
  7.         fi
  8. fi

  9. rm /opt/updata/* -rf
复制代码
运行结果:
ls: cannot access /opt/updata/camera_th/: No such file or directory
./updata.sh: line 5: /opt/updata/camera_th/: No such file or directory
cp: cannot stat `/opt/updata/camera_th/': No such file or directory

问题:如果是目录才拷贝目录下的内容,判断后应该不做拷贝才对,这里为什么会执行拷贝操作?

补充:修改为
  1. #!/bin/sh

  2. DIR=/opt/updata/camera_th/

  3. if [ -z "$DIR" ]
  4. then
  5.     if [ -d "$DIR" ]
  6.         then
  7.         echo "11111"
  8.     else
  9.         echo "2222"
  10.     fi
  11. fi

  12. rm /opt/updata/* -rf
复制代码
运行结果:
无显示且不提示
ls: cannot access /opt/updata/camera_th/: No such file or directory
./updata.sh: line 5: /opt/updata/camera_th/: No such file or directory
cp: cannot stat `/opt/updata/camera_th/': No such file or directory
不打印"2222"或“11111”

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-07-26 09:26 |只看该作者
cp /opt/updata/camera_th/ /opt/ -r 2>/dev/null

直接拷就行了,没必要判断

包子问题

论坛徽章:
0
3 [报告]
发表于 2012-07-26 09:39 |只看该作者
本帖最后由 zehn_w 于 2012-07-26 09:39 编辑

回复 2# waker
不知道什么是包子问题?
排除是否应该判断的问题,想知道为什么在不满足条件的情况下依然执行拷贝语句?
请赐教,谢谢您。


   

论坛徽章:
0
4 [报告]
发表于 2012-07-26 09:40 |只看该作者
肯定没输出,你的"$(/opt/updata/camera_th/)" 是什么?
[ -d ${DIR} ] && cp -rf ${DIR} /OPT

论坛徽章:
0
5 [报告]
发表于 2012-07-26 09:46 |只看该作者
回复 4# dwj19830118
不好意思,刚才编辑的时候笔误了。

“$(/opt/updata/camera_th/)” 这个是目录,是参照网络上的写法。


   

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2012-07-26 12:28 |只看该作者
回复 3# zehn_w


    直接去买包子==如果包子店有包子,那么买一个,如果没有则不买

    直接cp== 如果有目录则拷贝它,如果没有则不拷

论坛徽章:
0
7 [报告]
发表于 2012-07-26 13:41 |只看该作者
回复 6# waker

还是没有解答 if 那里的问题,我再多试试吧...
谢谢你!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2012-07-26 13:56 |只看该作者
回复 7# zehn_w


你可以屏蔽出错信息 $(ls /opt/updata/camera_th/ 2>/dev/null)
不过if是根本不需要的

论坛徽章:
0
9 [报告]
发表于 2012-07-26 13:58 |只看该作者
本帖最后由 personball 于 2012-07-26 14:05 编辑

回复 7# zehn_w


    条件测试 test,[]  的问题,你好好翻一下ABS里的TEST章节就行了,选项的使用要搞清楚

-z
string is null, that is, has zero length
String=''
# Zero-length ("null") string variable.
if [ -z "$String" ]
then
echo "\$String is null."
else
echo "\$String is NOT null."
fi
# $String is null.


PS: 1L 第二段代码中的 第一个if分支的条件是恒不成立的,你让程序打印啥?又没有else条件。。。

论坛徽章:
0
10 [报告]
发表于 2012-07-26 14:18 |只看该作者
if [ -z "$(ls /opt/updata/camera_th/)" ] # 目录不存在时,ls报错,“$(ls xxx)” 这部分的值为空字符串,-z 选项返回true
then
        if [ -d "$(/opt/updata/camera_th/)"]  # -d 选项,这个$() 不许要吧,直接把路径跟上就行 [ -d "/home/xxx" ]
        then
        cp /opt/updata/camera_th/ /opt/ -r
        fi
fi
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP