zoukankan      html  css  js  c++  java
  • Shell变量while循环内改变无法传递到循环外

    转自: https://blog.csdn.net/shawhe/article/details/65631543

    今天刷Leecode(192 Word frequency)时,遇到一个shell语法问题,记录下来。首先将题目描述和代码呈上

     1 #!/bin/bash
     2  
     3 # Write a bash script to calculate the frequency of each word in a text file words.txt.
     4 #
     5 # For simplicity sake, you may assume:
     6 #  words.txt contains only lowercase characters and space ' ' characters.
     7 #  Each word must consist of lowercase characters only.
     8 #  Words are separated by one or more whitespace characters.
     9 #
    10 # For example, assume that words.txt has the following content:
    11 # the day is sunny the the
    12 # the sunny is is
    13 #
    14 # Your script should output the following, sorted by descending frequency:
    15 # the 4
    16 # is 3
    17 # sunny 2
    18 # day 1
    19  
    20 # define a map
    21 declare -A map=()
    22  
    23 # iterator lines in file
    24 #cat words.txt | while read line
    25 while read line
    26 do
    27     for word in $line
    28     do  
    29         echo $word
    30         if [ -z ${map[$word]} ];then
    31             map[$word]=1
    32         else
    33             let map[$word]++
    34         fi  
    35     done
    36 done < words.txt
    37  
    38 for key in ${!map[@]}
    39 do
    40     echo $key ${map[$key]}
    41 done

     题目的意思是统计一个文件中单词重复的次数,开始写法如L24,while循环结束后,map依然为空,后来才知道是使用了管道的缘故
     当启用管道时,会生成一个subshell,while循环的代码在subshell中执行,那么变量map也是在subshell中被修改,
     while循环结束后,回到主shell,map没有被修改,也就是说,两个map不是同一个map,while中修改的map是外层map的副本
     修改代码,将读取文件的格式改成L36,程序运行正常

  • 相关阅读:
    运维常见面试题
    python常见面试题
    常见面试题
    常用算法之‘归并排序’
    python库大全
    Springboot拦截器无效,解决办法
    Springboot 不返回页面,只反回文本
    SpringBoot 接收参数的几种常用方式(转载)
    mysql 查询每个分组的前几名
    Java中TimeZone类的常用方法
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/10234108.html
Copyright © 2011-2022 走看看