我是靠谱客的博主 深情小鸽子,最近开发中收集的这篇文章主要介绍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.这里使用的方法主要是:将变量的值写入到一个文件中,文件是共享的,所以可以将变量传出来

最后

以上就是深情小鸽子为你收集整理的shell编程——使用管道的while循环无法将变量的值传出来的全部内容,希望文章能够帮你解决shell编程——使用管道的while循环无法将变量的值传出来所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部