在bash中对命令行参数进行冒泡排序

时间:2017-10-04 18:14:42

标签: bash

我需要创建一个冒泡排序来接受bash(ints)中的命令行参数并按升序打印出来。我相信我正确地实现了算法,但是我很难获得像参数一样的命令数组。到目前为止我的代码:

a =($[@]) 

flag=1
for (( i=0; i<$n-1 && $flag==1; i++ ))
do
    flag=0
    for (( j=0; j<$n-i-1; j++ ))
    do
        if [ ${a[$j]} -gt ${a[$j+1]} ]
        then
            temp=${a[$j]}
            a[$j]=${a[$j+1]}
            a[$j+1]=$temp
            flag=1
        fi
    done
done

for (( l=0; l -lt ${a[@]}; l++))
do
    echo -ne "${a[$l]} "
done

这是我运行程序时得到的错误:

bubble-sort.sh: line 6: syntax error near unexpected token `('
bubble-sort.sh: line 6: `a =("$@") '

问题是什么?

1 个答案:

答案 0 :(得分:2)

错误是第一次分配命令行参数。 bash shell中的赋值不允许使用空格。以下命令的含义是将命令作为a运行,参数字符串为=($[@])。你只需要做

argArray=( "$@" )

在使用for循环时,在脚本的后半部分也有错误,在((..))内你可以使用C风格的算术运算。您还需要遍历数组计数并且元素列表。使用"${#a[@]}"返回列表中元素的总数。

您可以<=代替-le

for (( l=0; l<="${#a[@]}"; l++ )); 

您的变量n在您显示的脚本的片段中未初始化。而不只是if [ ${a[$j]} -gt ${a[$j+1]}只做if (( ${a[$j]} > ${a[$j+1] ))

排序算法的工作版本是

argArray=( "$@" )
arrayLen="${#argArray[@]}"

flag=1
for (( i=0; i < arrayLen-1 && flag==1 ; i++ ))
do
    flag=0
    for (( j=0; j<arrayLen-i-1; j++ ))
    do
        if (( ${argArray[$j]} > ${argArray[$j+1]} )); then
            temp=${argArray[$j]}
            argArray[$j]=${argArray[$j+1]}
            argArray[$j+1]=$temp
            flag=1
        fi
    done
done

for (( l=0; l<arrayLen; l++))
do
    echo -ne "${argArray[$l]} "
done