对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>
来执行此操作。