今天刷Leecode(192 Word frequency)时,遇到一个shell语法问题,记录下来。首先将题目描述和代码呈上
-
#!/bin/bash
-
# Write a bash script to calculate the frequency of each word in a text file words.txt.
-
#
-
# For simplicity sake, you may assume:
-
# words.txt contains only lowercase characters and space ' ' characters.
-
# Each word must consist of lowercase characters only.
-
# Words are separated by one or more whitespace characters.
-
#
-
# For example, assume that words.txt has the following content:
-
# the day is sunny the the
-
# the sunny is is
-
#
-
# Your script should output the following, sorted by descending frequency:
-
# the 4
-
# is 3
-
# sunny 2
-
# day 1
-
# define a map
-
declare -A map=()
-
# iterator lines in file
-
#cat words.txt | while read line
-
while read line
-
do
-
for word in $line
-
do
-
echo $word
-
if [ -z ${map[$word]} ];then
-
map[$word]=1
-
else
-
let map[$word]++
-
fi
-
done
-
done < words.txt
-
for key in ${!map[@]}
-
do
-
echo $key ${map[$key]}
-
done
题目的意思是统计一个文件中单词重复的次数,开始写法如L24,while循环结束后,map依然为空,后来才知道是使用了管道的缘故
当启用管道时,会生成一个subshell,while循环的代码在subshell中执行,那么变量map也是在subshell中被修改,
while循环结束后,回到主shell,map没有被修改,也就是说,两个map不是同一个map,while中修改的map是外层map的副本
修改代码,将读取文件的格式改成L36,程序运行正常