Shell变量while循环内改变无法传递到循环外

今天刷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,程序运行正常

猜你喜欢

转载自blog.csdn.net/kwame211/article/details/81078772