博客
关于我
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/

    你可能感兴趣的文章
    突破Bias-Variance困境
    查看>>
    Form窗体属性
    查看>>
    解决宝塔安装wordpress无法连接到数据库问题
    查看>>
    解决Eclipse加载图片或网页出现404错误
    查看>>
    vue 错误收集
    查看>>
    Java选择排序算法实现
    查看>>
    00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
    查看>>
    00013.05 字符串比较
    查看>>
    IEDA全局搜索快捷键 Ctrl+shift+F无效的原因、 eclipse:Ctrl + h 进行全局搜索
    查看>>
    LeetCode: 138. 复制带随机指针的链表(中等)[DFS, 迭代]
    查看>>
    Effective Java 读书笔记
    查看>>
    SpringBoot使用@Email报错误
    查看>>
    Rabbitmq的内存磁盘监控
    查看>>
    访问servlet时弹出文件下载框解决方法
    查看>>
    Java中的注释
    查看>>
    cookie、session、token
    查看>>
    IDEA-@Slf4j和log标签&@Data(Lombok)无效
    查看>>
    SpringCloud-Eureka报错 Error creating bean with name解决
    查看>>
    Thymeleaf 生成下标,索引,使用Stat变量
    查看>>
    全局变量初始化顺序的不确定性引发的bug
    查看>>