Bash脚本-变量连接



对Linux和Bash脚本完全陌生,我一直在尝试以下脚本:

declare -a names=("Liam" "Noah" "Oliver" "William" "Elijah")
declare -a surnames=("Smith" "Johnson" "Williams" "Brown" "Jones")
declare -a countries=()
readarray countries < $2
i=5
id=1
while [ $i -gt 0 ]
do
i=$(($i - 1))
rname=${names[$RANDOM % ${#names[@]}]}
rsurname=${surnames[$RANDOM % ${#surnames[@]}]}
rcountry=${countries[$RANDOM % ${#countries[@]}]}
rage=$(($RANDOM % 5))
record="$id $rname $rsurname $rcountry"
#record="$id $rname $rsurname $rcountry $rage"
echo $record
id=$(($id + 1))
done

上面的脚本产生如下结果:

1 Liam Williams Andorra
2 Oliver Jones Andorra
3 Noah Brown Algeria
4 Liam Williams Albania
5 Oliver Williams Albania

但是当record="$id $rname $rsurname $rcountry"行得到注释时,问题变得明显行record="$id $rname $rsurname $rcountry $rage"是活动的其中第二次执行的确切输出是:

4William Johnson Albania
2Elijah Smith Albania
2Oliver Brown Argentina
0William Williams Argentina
3Oliver Brown Angola

我正在读取国家的文件如下所示:

Albania
Algeria
Andorra
Angola
Argentina

你能解释一下为什么会这样吗?

您的国家/地区输入文件具有dos样式的<cr><lf>(回车换行)行尾

当您从文件中读取行时,countries数组的每个元素最终看起来像somename<cr>,并且在打印时,<cr>将光标移回行开头,因此$rage的内容最终覆盖行开头。

修复方法是将您的国家/地区输入转换为使用Unix样式(仅<lf>)行结尾。例如,您可以使用dos2unix <inputfile> > <outputfile>来执行此操作。

最新更新