【Shell】while循环处理管道传入数据

完成如下要求:
读取/etc目录下的所有普通文件,寻找其中最长的一行,输出其内容和长度(忽略/etc的所有子目录)

#!/bin/bash

max_len=0
max_str=""

ls -l /etc | grep ^- | while read line; do
    len=${#line}	# 获取line变量的长度
    if ((len > max_len)); then
        max_len=$len
        max_str=$line
    fi
done

echo /etc下最长文件为:
echo ${max_str} length: ${len}

看似这段代码好像可以解决这个问题,但是最终的输出依然为空?
这是因为通过管道符,while循环是另一个子进程,而处理的数据,获得的max_len和max_str都不会传入父进程,所以需要想到一个将这个最值能够使父进程访问到的方法。
解决如下:通过传入到一个临时文件,然后父进程读取临时文件,最后将临时文件删除

#!/bin/bash

max_len=0
max_str=""

ls -l /etc | grep ^- | while read line; do
    len=${#line}
    if ((len > max_len)); then
        max_len=$len
        max_str=$line
        echo $max_str > tmp
        echo -n "len:" >> tmp
        echo $max_len >> tmp
    fi
done

echo /etc下最长文件为:
cat <tmp
rm tmp

版权声明:本文为qq_43909184原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。