我需要创建一个冒泡排序来接受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 =("$@") '
问题是什么?
答案 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