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

posted @ 2019-01-07 16:39  Boblim  阅读(2530)  评论(0编辑  收藏  举报