2017-10-04 73 views
1

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

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 

这是错误的GET当我运行该程序:

bubble-sort.sh: line 6: syntax error near unexpected token `(' 
bubble-sort.sh: line 6: `a =("[email protected]") ' 

有什么问题?

+1

使用'A =( “$ @”)'没有空格周围的'='无'[]围绕@ –

回答

2

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

argArray=("[email protected]") 

而且您在使用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=("[email protected]") 
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 
+1

出于好奇,除了偏好之外,为什么你建议C风格有条件的bash -gt方法?谢谢您的帮助。 –

+0

这仅仅是在_arithmetic_上下文!如果你适合使用具有适当变量引用的'-gt',一切都很好。既然你用'bash'标记了它,'((..))'操作符可以用于完整的算术上下文评估。如果你使用的是不带'bash'-isms的可移植性('POSIX'),那么'-gt'是正确的 – Inian

+1

是的,就是这样。谢谢你的帮助! –