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

使用 '=( "$ @を")' '='周りのスペースなしのノー '[]になりますのちょうどif ((${a[$j]} > ${a[$j+1]))

作業バージョンを行う代わりにif [ ${a[$j]} -gt ${a[$j+1]}の@ –

答えて

2

エラーは、この最初のコマンドライン引数の割り当てです。 bashシェルの割り当てではスペースを使用できません。以下のコマンドが意味することは、=($[@])という引数文字列を持つaというコマンドを実行することです。あなただけのループのため、あなたはCスタイルの算術演算を使用することができます((..))の内側を使用しているときに、スクリプトの後の部分でエラーが発生している。また

argArray=("[email protected]") 

を行う必要があります。また、配列数とではなく、要素リストをループする必要があります。 "${#a[@]}"を使用すると、リスト内の要素の合計数が返されます。

あなただけの代わりに-le

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

<=はまた、あなたの変数nはあなたが示されているスクリプトのスニペットに初期化されませんすることができます。また、あなたのソートアルゴリズムは

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

の好奇心の外に、なぜあなたはbash -gtメソッドよりもCスタイルの条件付きをお勧めしましたか?助けてくれてありがとう。 –

+0

ほとんどの場合、_arithmetic_コンテキスト内にあるだけです! '-gt'を適切な変数引用符で慣れていれば、すべてが問題ありません。あなたが 'bash'でタグ付けしているので、'((..)) '演算子を本格的な算術コンテキスト評価に使うことができます。あなたが 'bash'-ismsなしで移植性(' POSIX'に準拠している)を得ているなら、 '-gt'は – Inian

+1

を使うのが正しいですね。ご協力いただきありがとうございます! –

関連する問題