首页 > 解决方案 > 根据bash中的匹配设置变量等于值

问题描述

我有一个脚本,我想根据来自文件的匹配项(在 bash 中)设置一个等于特定值的变量。

例如:

.csv 中的文件包含:

Name,ID,Region
Device1,1,USA
Device2,2,UK

我想像这样在开头声明变量:

region1=USA
regions2=UK
region3=Ireland
etc...

然后,在读取 csv 时,我需要将Region列的名称与文件开头设置的全局变量匹配,然后在 API 中使用它。因此,如果 csv 中的设备具有美国的区域集,我应该能够region1在 API 中的更新调用期间使用。我想使用while循环逐行遍历 csv 文件,并更新每个设备的区域。

有谁知道我怎么能做到这一点?任何帮助将不胜感激。

PS:在有人问之前,这不是家庭作业:-)

标签: bash

解决方案


请您尝试以下方法:

declare -A regions              # an associative array

# declare your variables
region1=USA
region2=UK
region3=Ireland

# associate each region's name with region's code
for i in "${!region@}"; do      # expands to region1, region2, region3
    varname="$i"
    regions[${!varname}]="$i"   # maps "USA" to "region1", "UK" to "region2" ..
done

while IFS=, read -r name id region; do
    ((nr++)) || continue        # skips the header line
    region_group="${regions[$region]}"
    echo "region=$region, region_group=$region_group"   # for a test
    # call API here
done < file.csv

输出:

region=USA, region_group=region1
region=UK, region_group=region2
region=Ireland, region_group=region3

顺便说一句,如果开头的变量声明在您的控制之下,那么说起来会更容易:

# declare an associative aarray
declare -A regions=(
    [USA]="region1"
    [UK]="region2"
    [Ireland]="region3"
)

while IFS=, read -r name id region; do
    ((nr++)) || continue        # skip the header line
    region_group="${regions[$region]}"
    echo "region=$region, region_group=$region_group"   # for a test
    # call API here
done < file.csv

推荐阅读