Ошибка сценария Bash: [i: команда не найдена

Предполагается, что эта программа принимает число от пользователя и печатает столько простых чисел. По какой-то причине программа не работает. Я новичок в сценарии Bash, и это моя первая программа. На мой взгляд, все кажется правильным. Пожалуйста, скажите мне, где я ошибся.

<code>echo Enter num
read n
i=2
j=2

for(( i=2; i <= n; i++ ))
do

for(( j=2; j < i-1; j++ ))
do

if [i % j == 0];
then
break
fi


if [i == j];
then
echo "  $i"
fi
done
done
</code>

Это вывод, который я получаю

<code>Enter num
20
prime.sh: line 12: [i: command not found
prime.sh: line 18: [i: command not found
prime.sh: line 12: [i: command not found
prime.sh: line 18: [i: command not found
 .
 .
 .
</code>

После внесения предложенных изменений

<code>read -p "Enter a  number : " n
i=2
j=2
for(( i=2; i <= n; i++ ))
do
    for(( j=2; j <= i-1; j++ ))
    do
        if [ $(( i % j )) == 0 ]
        then
            break
        fi
        if [ i == j ]
        then
            echo "  $i"
        fi
    done
done
</code>

Мне удалось запустить программу, но она не дала никакого результата

http: //i.stack.imgur.com/Fd1se.pn

 Dennis Williamson01 мая 2012 г., 20:20
В Bash вы должны делать целочисленные сравнения внутри(()), например:if (( i % j == 0 )); then а такжеif (( i == j )); then. В этом случае знаки доллара не нужны. Кроме того, вам нужно сделать отступ для вашего кода. Когда вы делаете другие тесты (не целые) в Bash, вы должны использовать двойные квадратные скобкиif [[ $string1 == $string2 ]] а не одиночные.
 Roger That01 мая 2012 г., 14:31
Я изменилif [i % j == 0] а такжеif [i == j] вif [ i % j == 0 ] а такжеif [ i == j ]. Теперь написано Строка 11: слишком много аргументов. Строка 11 - этоif [ i % j == 0 ]
 chepner01 мая 2012 г., 15:38
j работает только от 2 доi -1. Это никогда не будет равноi.
 Daniel Kamil Kozar01 мая 2012 г., 14:34
Кроме того, вам нужно добавить$имвол @ при чтении переменных. Я такой глупый. :
 Daniel Kamil Kozar01 мая 2012 г., 14:10
Bash очень чувствителен к пробелам. В этом случае вы хотите заменить[i % j == 0] с[ i % j == 0 ].

Ответы на вопрос(4)

#!/bin/bash
#
# primes
#
read -p "Enter a  number: " n
i=2

for (( i=2; i <= n; i++ ))
do
    for (( j=2; j*j < i; j++ ))
    do
        if ((i % j == 0))
        then
            echo "no prime, $i divider: "$j
            break
        fi
    done
done
Обновлен, после осознания (спасибо Уилл Несс), что все простые числа до INPUT ищутся.

 user unknown02 мая 2012 г., 17:06
@ WillNess: Спасибо, обновлено.
 Will Ness02 мая 2012 г., 12:41
ОП явно пытается распечатать все простые числа ниже заданного числа, отсюда две петли. :)

if [i % j == 0]; Должно бытьif [ i % j == 0 ];

То же, что в строке 18

 Roger That01 мая 2012 г., 14:25
Должен ли я добавить знак $if [ $i % $j == 0]
Решение Вопроса

[ потому что[ это приложение.

И вы не можете делать расчеты между скобками. Вам нужно будет сказать bash, что он должен рассчитать значения. Поэтому вам нужно изменить строку 11 наif (( i % j == 0 )).

 DipSwitch01 мая 2012 г., 15:42
Второй, если это не расчет, однако== это bash comperator, использующий-eq чаще встречается, что сделаетif [ $i -eq $j ]
 DipSwitch02 мая 2012 г., 12:47
Приложение[ / test поддерживает = и == в качестве аргументов, поэтому вам не нужно делать это вычисление иif [ $i == $j ]; then ..; fi; будет достаточно. Для части вычисления по модулю ... Я исправил это, спасибо
 user unknown02 мая 2012 г., 11:23
@ DipSwitch: i == jявляетс расчет. если(( i % j == 0 )) сделает это.
 Roger That01 мая 2012 г., 14:49
а как насчет второго условия?

Как и другие,[ программе нужен пробел перед ее параметрами, как и всем программам нужен пробел перед своими аргументами. Это одна из причин, почему я предпочитtest встроенный[ с его хитрым синтаксисом, требующим бесполезного] как последний аргумент, чтобы выглядеть красиво и вменяемым.

if test $((i % j)) = 0; then
   break
fi
 Roger That01 мая 2012 г., 15:00
Тестируешь ключевое слово?
 Jens01 мая 2012 г., 17:01
Нет, утилита (которую многие оболочки предоставляют как встроенную). Но на многих Unices вы найдете/bin/test или/usr/bin/test (обычно это жесткие ссылки на/bin/[ или/usr/bin/[). Разница в том, что[ требует] в качестве последнего аргумента, поэтому синтаксис выглядит вменяемым (он не служит никакой другой цели).

Ваш ответ на вопрос