shell编程——使用管道的while循环无法将变量的值传出来

# 问题描述:实用类似ls | find *.c | while read line,后循环中的变量的值传不出来

实例:

#!/bin/bash

count=0

ls | find f* | while read line

do

  if [ -f $line ]; then

      count=$[$count+1]

       echo count

  fi

done

echo count

输出:

    1

    2

    3

    0

当前文件夹下有f.c ,f1.c , f2.sh 三个以f开头的文件,原本希望最终输出的计数器count为3,但是实际结果为0,同时,当count存在于循环里面的时候,count的是是改变了的。但出来后又变成了0,究竟是为什么了?

第一反应:count的作用域不是全局的(实际上,在这里count是全局变量)

再次思考:这里使用管道 “ | ”,这样会打开新一个新的shell,由于count不再同一个shell中,所以不会将count的值传出来。

解决方法

#! /bin/bash

count=0

ls | find f*  > /tmp/$$.list

while read line

do

  if [ -f $line ]; then

      count=$[$count+1]

      echo $count

  fi

done < /tmp/$$.list

echo $count
或者
#!/bin/bash

count=0

ls | find f* | while read line

do

  if [ -f $line ]; then

      count=$[$count+1]

        echo  $count  > /tmp/$$.list

  fi

done

cat /tmp/$$.list
知识点总结:
1. > 表示重导向,可以理解最写入的意思。>> 表示追加写入
2 . /tmp/$$.list 是一个tmp目录下的一个以进程id命名的临时文件,进程结束后,该文件即被销毁
3.这里使用的方法主要是:将变量的值写入到一个文件中,文件是共享的,所以可以将变量传出来
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是lk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值