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

今天刷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:

# the4

# is3

# sunny2

# day1

# define a map

declare -A map=()

# iterator lines in file

L24 #cat words.txt |whileread line

whileread line

do

forword in $line

do

        echo $word

if[ -z ${map[$word]} ];then

map[$word]=1

else

            let map[$word]++

        fi 

    done

L36done < words.txt

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容