2017-10-04 55 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

是的,就是這樣。謝謝你的幫助! –