从包含冒号分隔符的文件中创建bash关联数组

我有一个名为country.txt的文件

cat countries.txt
Germany:berlin
Japan:tokyo
usa:washington
canada:ottawa
uk:london

file='countries.txt'
readarray -t countries < "$file"

for i in "${!countries[@]}"
do
  echo "key  : $i"
  echo "value: ${filenames[$i]}"
done

key  : 0                   
value: Germany:berlin   
key  : 1                   
value: Japan:tokyo   
key  : 2                   
value: usa:washington    
key  : 3                   
value: canada:ottawa  
key  : 4                   
value: uk:london   

我的bash版本是4.1.2

我期望看到的输出是国家(国家)和价值(它们的首都)的关键

在下面的Inian帮助下并使用IFS =:我得到了一些奇怪的答案

declare -A countries
file='countries.txt'

while IFS=: read -r key value; do
    countries["$key"]="$value"
done < "$file"

for cap in "${!countries[@]}"; do
    echo "$cap" "${countries[$cap]}"
done

Japan:tokyo      
uk london        
usa:washington   
canada:ottawa    
Germany berlin   
canada ottawa    
Germany:berlin   
0 countries.txt  
uk:london        
usa washington   
Japan tokyo   
a22037181 回答:从包含冒号分隔符的文件中创建bash关联数组

mapfile中的readarray / bash内置可创建仅 索引数组。由于您没有提供任何分隔符来分割输入文件的内容,因此该命令仅在数组中为存在的每个输入行创建一个条目。

如果您要创建一个将:之前的值用作键的关联数组,则需要一个while循环来解析在:上分割的每一行并声明要显式用作关联的数组。请注意,只有大于4的版本才能使用关联数组。

# declares an explicit associative array
declare -A countries

while IFS=: read -r key value; do
    countries["$key"]="$value"
done < "$file"

现在此数组可以遍历索引,并且元素可以打印为

for cap in "${!countries[@]}"; do
    printf '%s\n' "$cap" "${countries[$cap]}"
done

有关如何在bash中使用各种数组类型的更多详细信息,请参见BashGuide/Arrays

本文链接:https://www.f2er.com/3140235.html

大家都在问