免费注册 查看新帖 |

Chinaunix

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

[系统管理] shell脚本的当前目录问题:if语句切换目录,语句结束之后无效吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-27 14:59 |只看该作者 |倒序浏览
本帖最后由 little_tony 于 2014-08-27 15:02 编辑

一,我的top目录是:/home/ftp-mxy/test-dir,其目录结构为:

ftp-mxy@ubuntu:~/test-dir$ tree .
.
├── config2
├── config3
├── log
├── test-subdir1
│   └── log
└── test-subdir2

二,一个验证脚本:config2
#!/bin/sh

export CURDIR="$(/bin/pwd)"
echo  "当前目录是:$CURDIR"

TOPDIR=/home/ftp-mxy/test-dir
DIR1=/home/ftp-mxy/test-dir/test-subdir1
DIR2=/home/ftp-mxy/test-dir/test-subdir2



for valdir in $DIR1 $DIR2; do
(
        export CURDIR="$(/bin/pwd)"
        echo  "FOR语句中,IF语句之前,valdir=$valdir当前目录是:$CURDIR"

        if [ -f $valdir/log ]; then
                                tempdir=$valdir
                                cd $tempdir
                                export CURDIR="$(/bin/pwd)"
                                echo  "FOR语句中,IF语句之中,valdir=$valdir当前目录是:$CURDIR"
                                $tempdir/log
        fi

        export CURDIR="$(/bin/pwd)"
        echo  "FOR语句中,IF语句之后,valdir=$valdir当前目录是:$CURDIR"
)
        done
export CURDIR="$(/bin/pwd)"
echo  "FOR之后,IF语句之后,当前目录是:$CURDIR"


三,log文件脚本内容:
#!/bin/sh

echo "---------------这是test-dir1的log文件"



四:运行结果:
ftp-mxy@ubuntu:~/test-dir$ ./config2
当前目录是:/home/ftp-mxy/test-dir
FOR语句中,IF语句之前,valdir=/home/ftp-mxy/test-dir/test-subdir1当前目录是:/home/ftp-mxy/test-dir
FOR语句中,IF语句之中,valdir=/home/ftp-mxy/test-dir/test-subdir1当前目录是:/home/ftp-mxy/test-dir/test-subdir1
---------------这是test-dir1的log文件
FOR语句中,IF语句之后,valdir=/home/ftp-mxy/test-dir/test-subdir1当前目录是:/home/ftp-mxy/test-dir/test-subdir1
FOR语句中,IF语句之前,valdir=/home/ftp-mxy/test-dir/test-subdir2当前目录是:/home/ftp-mxy/test-dir
FOR语句中,IF语句之后,valdir=/home/ftp-mxy/test-dir/test-subdir2当前目录是:/home/ftp-mxy/test-dir
FOR之后,IF语句之后,当前目录是:/home/ftp-mxy/test-dir
ftp-mxy@ubuntu:~/test-dir$

五:结果:
由上面的运行结果第一次FOR循环,cd进了目录test-subdir1
可是IF语句结束之后,第二次FOR循环开始时怎么当前目录又变为顶层test-dir

请问shell脚本中有什么这方面的规律与机制吗?

论坛徽章:
0
2 [报告]
发表于 2014-08-27 15:04 |只看该作者
帮顶下, 我这种粗心的人看不下去~

论坛徽章:
0
3 [报告]
发表于 2014-08-27 15:27 |只看该作者
应该是括号的问题,把do后面的括号去掉。

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
4 [报告]
发表于 2014-08-27 15:45 |只看该作者
本帖最后由 chengchow 于 2014-08-27 15:46 编辑

粗略看了下,问题挺多了,楼主刚学写脚本吧
1. for 语句do开始,done结束,不需要()
2. if 语句$valdir这个变量哪里定义的,而且建议用"$valdir/log"

论坛徽章:
0
5 [报告]
发表于 2014-08-27 15:58 |只看该作者
()表示命令组。在括号中的命令列表, 将会作为一个子shell来运行.
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.

验证
[root@localhost ~]# a=123
[root@localhost ~]# (export a=321)
[root@localhost ~]# echo $a
123
[root@localhost ~]#

论坛徽章:
0
6 [报告]
发表于 2014-08-27 16:32 |只看该作者
回复 5# pipal_zh


    原来如此啊,豁然开朗!

论坛徽章:
0
7 [报告]
发表于 2014-08-27 16:34 |只看该作者
chengchow 发表于 2014-08-27 15:45
粗略看了下,问题挺多了,楼主刚学写脚本吧
1. for 语句do开始,done结束,不需要()
2. if 语句$valdir这 ...


呵呵,的确是刚接触,在读QT的脚本,里面也是写了小括号的,我是依样画葫芦,也在上面写了个小括号,所以出现了上面的问题。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2014-08-27 16:34 |只看该作者
放到()里面就无效了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP