Синтаксическая ошибка рядом с неожиданным токеном - PullRequest
1 голос
/ 18 марта 2012

Это мой код для сортировки пузырьков по n числам:

#!/bin/bash

echo -n  "Input n, the number of numbers"
read N
declare -a array[N]
echo -e "Input the elements, press enter after each element"
for i in seq 1 $N  
do 
    read array[$i]
done

swap1()
{ # for swapping two numbers, we are employing bubble sort
    local temp = ${array[$1]} 
    array[$1] = ${array[$2]}
    array[$2]=$temp
    return
}

numb_elements=${#array[@]}
let "comparisons = $numb_elements - 1"

count=1

while [ "$comparisons" -gt 0]
do
   index =0

   while[ "$index" -lt "$comparisons" ];do
      if [ ${array[$index]} \> ${array[ 'expr $index + 1']} ]
      then 
         swap1 $index 'expr $index + 1'
      fi
      let "index += 1" # Or, index+=1 on Bash, ver. 2.1 or newer
   done

   let "comparisons -=1"
   echo 
   echo "$count: ${array[@]}
   echo

   let "count +=1"
done
exit 0

У меня две проблемы с этим кодом:

  1. входной массив занимает всего 3 числа
  2. и затем я получаю сообщение об ошибке в строке 42 о синтаксической ошибке для команды, в то время как

Я пытался while [] ; do, но это не работает.

Это был только день, когда я пробовал синтаксис bash.

Ответы [ 4 ]

2 голосов
/ 18 марта 2012

Более того, не пишите

for i in seq 1 $N

, который повторяет i по набору {"seq", "1", $ N}, но введите

for i in $(seq 1 $N)

, чтобы вставить результаткоманды как часть кода.

Вы забыли заключительную кавычку в этой строке:

echo "$count: ${array[@]}

Также код вложенных циклов имеет плохой отступ, поэтому его немного сложночитать и отлаживать.

2 голосов
/ 18 марта 2012

Пока я нашел следующие ошибки:

while [ "$comparisons" -gt 0 ]
                            ^ missing space here

while [ "$index" -lt "$comparisons" ];do
     ^ missing space

echo "$count: ${array[@]}"
                         ^ missing quote

Обратите внимание, что в bash [ эквивалентно команде test, поэтому требуется пробел около [ и ] в отличие от многих других языков программирования.

1 голос
/ 18 марта 2012

Вы допустили серию ошибок:

  • правильные пробелы имеют основополагающее значение для сценариев оболочки
  • отсутствует `` подходит для выполнения кода и получения вывода
  • логическая ошибка (начало вставки со второго элемента массива и использование его с первого)
  • повторение неправильного количества времени для сортировки пузырьков alg

Это ваш код исправлен.

#!/bin/bash

swap1() { # for swapping two numbers, we are employing bubble sort
        local temp=${array[$1]}

        array[$1]=${array[$2]}
        array[$2]=$temp
        return
}


echo -n "Input n, the number of numbers: "

read N
declare -a array[$N]

echo -e "Input the elements, press enter after each element"
for i in `seq 1 $N`
do
        read array[$i]
done

numb_elements=${#array[@]}
#let "comparisons = $numb_elements - 1"
comparisons=$numb_elements
count=1
while [ "$comparisons" -gt 0 ]
do
        index=1
        while [ "$index" -lt "$comparisons" ]
        do
                tmp=`expr $index + 1`
                if [ ${array[$index]} -gt ${array[$tmp]} ]
                then 
                        swap1 $index $tmp
                fi
                let "index += 1" # Or, index+=1 on Bash, ver. 2.1 or newer
        done
        let "comparisons -= 1"
        echo
        echo "$count: ${array[@]}"
        echo
        let "count += 1"
done

exit 0  
1 голос
/ 18 марта 2012

Попробуйте это:

while [ "$comparisons" -gt 0]

должно быть (обратите внимание на пробел перед закрывающей скобкой ]):

while [ "$comparisons" -gt 0 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...