概述
# 问题描述:实用类似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循环无法将变量的值传出来所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复