Bash中如何在while循环结束后保留变量值?
解决Shell循环中变量无法累计的问题
问题根源
你遇到的问题是因为管道会创建子shell。当你用cat $file | while read line时,while循环是在子进程里运行的,子进程会复制父进程的count变量,但子进程里对count的修改不会同步回父进程。所以外层的count始终是初始的0。
另外提一句:用$(ls /path)遍历文件是不安全的,如果文件名包含空格、特殊字符会出错,建议直接用/path/*通配符。
修复方案
把文件重定向到while循环,避免使用管道,这样while就在当前shell执行,变量修改会保留:
count=0 # 用通配符遍历文件,避免ls的坑 for file in /path/* do # 直接将文件作为read的输入,不用管道 while read line do count=$((count+1)) echo $count # 这里可以加你的if语句,比如: # if [ 条件 ]; then ...; fi done < "$file" done echo $count # 现在会输出正确的累计数
其他思路
如果你的需求只是统计所有文件的总行数,不用循环这么麻烦,直接用:
wc -l /path/*
但如果需要在循环里做额外的判断逻辑,上面的重定向方法是最可靠的。
内容的提问来源于stack exchange,提问作者culpinha
相关产品推荐
相关产品推荐

