美文网首页
Shell__管道符读取文件及小问题

Shell__管道符读取文件及小问题

作者: guyuetftb | 来源:发表于2019-12-05 11:47 被阅读0次

业务需要,开发一个自动添加 监控 flume 进程的 crontab 任务。大概思路是 如果用户配置了 crontab 那么把所有 crontab 内容先输出到一个文件中,之后逐行读取文件中的内容,把内容重新定位到新的文件中。循环读取过程中 判断当前行是否是 flume 监控,如果是 并且 监控被注释了,就解注,并对 操作次数变量flume_action_nums加1,最后根据 操作变量的值, 决定是否 更新 用户的 crontab。
网上学习了一种读取 文件的方式,如下面脚本。调试时,发现,第2步 读取文件正常,在函数内 打印输出的变量值也正常,但是第3步,判断 flume_action_nums 的值时,flume_action_nums 值总为0.

问题原因:
Goole查询得知,是 管道符| 的使用问题,因为 | 符两边是2个独立的子进程,他们是相互 独立执行的,所以在 第3步,获取不到 变量 flume_action_nums 的值。

1. 定义整型变量:
declare -i flume_action_nums=0;

2 读取文件
cat $TMP_CRONTAB_FILE_CURRENT | while read -r line ;
do
    line_has_flume_monitor=$(echo "$line" | grep -s -R "$CONSTANT_STR_GREP_KEYWORD_FLUME");
    if [ "$line_has_flume_monitor" != '' ]; then
        is_comment=$(echo "$line" | grep '^[[:space:]]*#*');

        if [ "$is_comment" != '' ]; then
            echo '--------------> Flume 监控已经添加, 但被注释掉了, 解注 ! <-----------------';
            # Flume 监控被注释掉了, 去掉注释, 输出到新文件

            let flume_action_nums+=1;
            echo '------------ flume_action_nums = '$flume_action_nums;
            echo -e "${line##*#}" >> $TMP_CRONTAB_FILE_NEW;
        else
            echo '--------------> Flume 监控已经添加, 运行正常 ! <-----------------';
            # Flume 监控部署正常
            echo "$line" >> $TMP_CRONTAB_FILE_NEW;
            continue;
        fi
    else
        ## 不是 flume 监控的行, 输出到新文件
        echo "$line" >> $TMP_CRONTAB_FILE_NEW;
    fi
done;

3. 判断操作次数, 不为0,说明有更新操作,则更新 crontab  内容。
if [ $flume_action_nums != 0 ]; then
    `cat $TMP_CRONTAB_FILE_NEW | crontab -`
    echo '--------------> Flume 监控已经添加, Exit ! <-----------------';
else
    echo '--------------> Flume 监控已经添加 ! <-----------------';
fi

管道符

"|" 管道符是 Linux 提供的命令操作符,管道符用 "|" 将命令隔开,管道左边命令的输出,做为 管道右边命令的输入。管道符可以同时连接多个命令。管道符 两边的命令,分别在 独立的进程中执行。

相关文章

网友评论

      本文标题:Shell__管道符读取文件及小问题

      本文链接:https://www.haomeiwen.com/subject/jgldgctx.html