我正在尝试从文件中读取它包含的数据并从文件中获取 2 个重要数据并在 bash 脚本中使用它。 一个字符串,然后是一个数字,例如:
Box 12
Toy 85
Dog 13
Bottle 22
我想我可以编写一个while
循环来循环文件并将数据存储到变量中。 但是我需要两个不同的变量,一个用于数字,一个用于单词。 如何将它们分成两个变量?
示例代码:
#!/bin/bash
declare -a textarr numarr
while read -r text num;do
textarr+=("$text")
numarr+=("$num")
done <file
echo ${textarr[1]} ${numarr[1]} #will print Toy 85
数据存储到两个数组变量中:textarr
numarr
。您可以使用索引${textarr[$index]}
访问它们中的每一个,也可以使用${textarr[@]}
一次访问所有这些
将所有数据读入单个关联数组(在 bash 4.0 或更高版本中):
#!/bin/bash
declare -A data=( )
while read -r key value; do
data[$key]=$value
done <file
完成此操作后,您可以有效地按键检索值:
echo "${data[Box]}"
。或遍历所有键:
for key in "${!data[@]}"; do
value=${data[$key]}
echo "Key $key has value $value"
done
您会注意到read
在其参数列表中有多个名称。当给定多个参数时,它会按 IFS 拆分字段,将列放入各自的变量中(如果存在的列数多于命名的变量数,则行的其余部分将进入命名的最后一个变量)。
在这里,我提供了我自己的解决方案,应该讨论一下。 我不确定这是否是一个好的解决方案。 使用 while read 构造的缺点是启动一个新的 shell,并且它将无法更新循环之外的变量。 下面是一个示例代码,您可以对其进行修改以满足自己的需要。如果要使用更多列数据,则需要稍作调整。
#!/bin/sh
res=$(awk 'BEGIN{OFS=" "}{print $2, $3 }' mytabularfile.tab)
n=0
for x in $res; do
row=$(expr $n / 2)
col=$(expr $n % 2)
#echo "row: $row column: $col value: $x"
if [ $col -eq 0 ]; then
if [ $n -gt 0 ]; then
echo "row: $row "
echo col1=$col1 col2=$col2
fi
col1=$x
else
col2=$x
fi
n=$(expr $n + 1)
done
row=$(expr $row + 1)
echo "last row: $row col1=$col1 col2=$col2"