bash - 根据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:在有人问之前,这不是家庭作业:-)
解决方案
请您尝试以下方法:
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
推荐阅读
- ios - 警告 ITMS-90725:SDK 版本问题
- sql - SQL 平台中“order by”子句中的参数化
- python - Python gspread update_cell 在一个函数中接受参数,在另一个函数中接受错误
- ios - UITextView:让自动检测到的电话号码、地址和日历事件使用与链接相同的样式?
- json - 如何添加 nunjucks-date-filter?
- templates - 避免使用 CRTP 进行对象切片时的问题
- coq - 携带证明的感应型
- arrays - 从 Mongoose Find() 查询中将属性添加到对象数组
- javascript - 隐藏 DataTables 导出功能和分页
- java - Java 8 设置迭代器排除值