博客
关于我
Shell变量while循环内改变无法传递到循环外
阅读量:636 次
发布时间:2019-03-15

本文共 1674 字,大约阅读时间需要 5 分钟。

今天在地磁쌔 낭.textContentYunsongWang在尝试解决LeetCode的“192 Word frequency”问题时遇到了一个关于Bash脚本的挑战。为了统计文件中单词的频率,初次写法遇到了一些问题。通过仔细分析和修正,最终找到了解决方案。下面详细记录这一过程。

本文将分步骤介绍如何编写一个Bash脚本解决问题,包括代码解析和优化。

  • 目标与要求理解首先明确问题的核心:结合给定的文本文件,统计每个单词的出现频率,并按降序输出结果。文件中的单词仅由小写字母组成,之间由任意数量的空格分隔。但最初的脚本在实际运行中遇到了意外问题。

  • 初步代码尝试与错误分析初次编写脚本时,代码结构大致如下:

  • #!/bin/bash# 统计单词频率并输出结果# 文本文件路径:words.txtdeclare -A map=()cat words.txt | while read linedo  for word in $line  do    if [ -z "${map[$word]}" ]; then      map[$word]=1    else      map[$word]++    fi  donedone < words.txt

    运行脚本后,却发现结果不正确。进一步调试发现,问题出在while read line的处理方式上。原因是Bash中的管道操作会在子shell中执行,而变量map是在子shell中的临时副本。因此,在主shell中的map数组未能得到正确更新,导致统计结果偏差。

    1. 优化代码策略为了尽量减少在子shell中变量影响范围的风险,可以直接使用while循环而避免使用管道。这样,循环内部的处理逻辑能够直接作用于主shell中的map数组。修改后的代码如下:
    2. #!/bin/bash# 统计单词频率并按降序输出# 文本文件路径:words.txtdeclare -A map=()while read linedo  for word in $line  do    if [ -z "${map[$word]}" ]; then      map[$word]=1    else      map[$word]++    fi  done  done < words.txt

      修改的关键点为:

      • 直接读取文件:不使用cat命令,而直接在while循环中读取每行。
      • 避免子shell:通过直接读取文件减少了潜在的变量冲突风险。
      1. 进一步优化与验证为了确保代码正确性,建议在实际环境中进行测试。测试过程中需要保证以下几点:
        • 文件路径正确:确保脚本能够正确读取指定文件。
        • 文件处理方式正确:确认每行空白符被正确处理,尤其是多余的空白行。
        • 结果输出排序正确:按照降序排列单词频率,确保最高频率的单词首先输出。
        1. 如何实现正确的单词处理在读取文件的过程中,read line会自动处理换行符。在分割单词时,可以使用tr ' ' '\n'sort命令结合使用,但根据题目要求单词由小写字母组成且默认由空格分隔,不需要额外分隔处理。如果有多个空格,每个单词依然会被正确识别。

        2. 最高频率排序处理在输出阶段,可以通过对map数组的键(单词)进行双重循环,从高到低输出。虽然Bash本身没有内置对数组按值排序的命令,但可以通过查找帮助组件(如compgen)实现自定义排序方式。

        3. 当前脚本的正确结果示例假设输入文件words.txt内容如下:

        4. the day is sunny the thethe sunny is is

          运行修正后的脚本,预期输出应为:

          the 4is 3sunny 2day 1
          1. 总结与优化通过以上步骤,可以发现,编写Bash脚本需要细致分析变量作用域和脚本执行流程。在处理文件时,确保脚本逻辑正确,避免因环境变量冲突导致的意外问题。同时,本文脚本可以进一步优化,例如增加错误处理和冲突检测,以应对更复杂的实际应用场景。
          2. 最终,该问题的解决方案通过谨慎对待变量作用域和脚本结构,确保了统计结果的准确性。

    转载地址:http://sfxlz.baihongyu.com/

    你可能感兴趣的文章
    Docker方式启动tomcat,访问首页出现404错误
    查看>>
    Docker方式启动tomcat,访问首页出现404错误(第二篇 -- 将修改过的容器映射成镜像)
    查看>>
    【蓝桥杯】 java 大学c组 省赛 1、隔行变色
    查看>>
    BIM轻量化——浏览器展示 | 利用unity
    查看>>
    超市账单管理系统
    查看>>
    Springboot实现热部署
    查看>>
    composer 介绍、安装及基本使用方法
    查看>>
    PHP 的 ::class 用法
    查看>>
    Python学习之列表用法
    查看>>
    升级qiime2
    查看>>
    Docker 阿里云CentOS 安装
    查看>>
    Bootstrap提交表单基本组件
    查看>>
    需求分析
    查看>>
    查找单链表中倒数第k个节点
    查看>>
    linux中rm和rmdir的区别
    查看>>
    JUC源码分析-序章
    查看>>
    面试高频 C++ 知识总结
    查看>>
    小易的升级之路,找出字符串中第一个只出现一次的字符
    查看>>
    创建组出现错误:对COM组件的调用返回了错误 HRESULT E_FAIL。小敏
    查看>>
    数组去重的常用的几种方法
    查看>>