免费注册 查看新帖 |

Chinaunix

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

管道引起的赋值问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 16:45 |只看该作者 |倒序浏览
#!/bin/bash

pp=10
echo $pp
for path in /FTP/*/Download ; do
cd $path
echo `pwd`
  pp=0
done
echo $pp
echo
echo

cd /FTP/JRL/Download
   p=11
   echo '$p='$p
   ls -l  --time-style +%Y%m%d | grep ^[^d] | awk '{print $6}' | sed -e '/^$/d'  | while read name;
   do
      echo $name
      p=0
   done
   echo $p

----------------------------------------------------
[perl@www bashcode]$ c.sh
10
/FTP/HLJW/Download
/FTP/JRL/Download
/FTP/ZTDX/Download
0


$p=11
20080827
20080827
11

第一次for,pp的值在循环体中更改,退出循环后,成功置为0;
第二次for,p的值在循环中更改,退出循环后,值依然为11;
为何如此?管道的问题?

[ 本帖最后由 lioulb 于 2008-8-28 16:46 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-28 16:47 |只看该作者
试试

p=11

改成

export p=11

论坛徽章:
0
3 [报告]
发表于 2008-08-28 16:58 |只看该作者

回复 #2 sakulagi 的帖子

依然如此:

cd /FTP/JRL/Download
   export p=11
   echo '$p='$p
   ls -l  --time-style +%Y%m%d | grep ^[^d] | awk '{print $6}' | sed -e '/^$/d'  | while read name;
   do
      echo $name
   p=0
   done
   echo $p
   
$p=11
20080827
20080827
11

论坛徽章:
0
4 [报告]
发表于 2008-08-28 16:59 |只看该作者
sorry。我想错了。我再试验一下

论坛徽章:
0
5 [报告]
发表于 2008-08-28 17:02 |只看该作者

回复 #1 帖子

兄弟说得太客气了!

论坛徽章:
0
6 [报告]
发表于 2008-08-28 17:14 |只看该作者
又仔细看了手册,应该是无法做到楼主的要求的。管道会产生一个subshell,这样p这个变量在有管道的那个循环里做的任何修改在循环外都是看不到的。

论坛徽章:
0
7 [报告]
发表于 2008-08-28 17:21 |只看该作者

回复 #6 sakulagi 的帖子

根据
find . -maxdepth 1 -type f -print0 |xargs -0 ls -l
修改一下,可以达到要求吗?
我不太熟悉这个用法

论坛徽章:
0
8 [报告]
发表于 2008-08-28 20:43 |只看该作者

  1. #!/bin/bash

  2. pp=10
  3. echo $pp
  4. for path in /* ; do
  5.         cd $path
  6.         echo `pwd`
  7.         pp=0
  8. done
  9. echo $pp
  10. echo
  11. echo

  12. cd /
  13. p=11
  14. echo '$p='$p
  15. echo $BASH_SUBSHELL
  16. for name in `ls -l  --time-style +%Y%m%d | grep ^[^d] | awk '{print $6}' | sed -e '/^$/d'`
  17.               do
  18.                       echo $BASH_SUBSHELL
  19.                       echo $name
  20.                       p=0
  21.               done
  22.               echo '$p='$p
复制代码


这是我试验的结果,细节略有不同,不过应该可以达到楼主的要求

论坛徽章:
0
9 [报告]
发表于 2008-08-29 10:06 |只看该作者

回复 #8 sakulagi 的帖子

find  -maxdepth 1 -type f -print0 |xargs -0 ls -l  --time-style +%Y%m%d | awk '{print $6}' | while read mtime;
   do
      #echo $mtime
      if [ "$mtime" = "$1" ]; then
        echo existFile=1 >/tmp/.ready.$$
      fi
   done

   . /tmp/.ready.$$ 2>/dev/null
   if [ "$existFile" -eq 0 ]; then
       echo 'path='$path" ....... no this day "$1

这个可以解决,哥们的语句我还没得及试,晚点试一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP