冒泡排序bash脚本

时间:2020-10-21 15:28:08

标签: linux bash shell command-line

我正在尝试使用冒泡排序按bash的字典顺序对名称及其分数列表进行排序。数组是

Ted 86
Anthony 70
Mark 95
Kyle 65
David 75

名称存储在数组名称中,分数存储在数组分数中

这是我的代码,它在第30行给我一个错误,说“有很多参数”,我似乎找不到原因。

#! /bin/bash
inputfile="$1"

if [[ !(-f "$1") ]]; then
    echo "$1 must be a file"
    exit 1
else
    echo "$1 is a file"
fi

names=()
scores=()

while IFS= read -r name score
do
    names+=( "$name" )
    scores+=( "$score" )
done < $inputfile
echo "The arrays before sorting"

for (( i=0; i<${#names[@]}; ++i ))
do
    echo "${names[$i]} ${scores[$i]}"
done

echo "The sorted arrays using bubble sort"
for (( i = 0; i < ${#names[@]}; i++ ))
do
    for (( j = $i; j < ${#names[@]}; j++ ))
    do
            if [ ${names[$i]} -gt ${names[$j]} ]; then #error here
                    t=${names[$i]}
                    names[$i]=${names[$j]}
                    names[$j]=$t
            fi
    done
done

for (( i=o; i<${#names[@]}; ++i ))
do
    echo "${names[$i]}"
done

有人可以复制并粘贴以查看是否遇到相同的问题吗?

1 个答案:

答案 0 :(得分:0)

IFS =时读取-r名称分数

是错误的。使用IFS=时,不会拆分任何单词-整行分配给name,而score始终为空。

我似乎找不到原因。

由于您向[传递了多个参数,因此扩展为i=0 j=1之前的值:

# if [ ${names[$i]} -gt ${names[$j]} ]
# expands to:
if [ Ted 86 -gt Anthony 70 ]

没有[程序接收6个参数,并且不知道如何处理它们-因此它退出并出现错误。解决上述IFS问题时-仍在将名称作为数字-gt进行比较-我猜您的意思是按人员对他们进行排序分数而不是名称。