2014-10-30 5 views
-1

У меня есть этот кодКоманда не может быть найдено

#!/bin/bash 
read num 
sum=0 
i=1 
while [$i -le $num]; do 
    let sum=$sum+1 
    let i=$i+1 
done 
echo $sum 

Я получаю ошибку ./test: Строка 5: [1: команда не найдена, но я не уверен, что часть этого не так и Не может быть найдено.

+2

Пространство является важным. '[$ i' должно быть' [$ i' и '$ num]' должно быть '$ num]'. –

+0

Нужно ли все пространства с обеих сторон? – jmurphy1267

+1

Определите «все». Команды выполняются. 'echo" foo "' - это не та же команда, что и 'echo 'foo" '. '[' ничем не отличается. Это, случается, встроенная оболочка, но это также команда (см. 'Type -p ['). ']' является закрывающим синтаксическим маркером, а также должен быть один, чтобы его можно было увидеть, да. –

ответ

1

Вы можете использовать арифметическое расширение:

#!/bin/bash 

# This function does safe read of a number 
read_number() 
{ 
    read x 

    # Check for an actual number 
    case "$x" in ""|*[^0-9]*) echo "Not a number" >&2; exit 1;; esac 

    # Consider base 10 
    echo "$((10#$x))" 
} 

num=$(read_number) 

sum=0 
i=1 
while ((i <= num)); do 
    ((sum++, i++)) 
done 
echo $sum 
+2

Вы также должны проверить, что 'num' является фактическим числом. Не используйте ввод пользователя без его очистки: в этом случае ваш код подвергается произвольной инъекции кода. –

+0

Вы правы; Я добавил чек. –

+0

И чтобы избежать другой ловушки: 'while ((i <= 10 # $ num))', на всякий случай пользователь вводит что-то вроде '09'. –

Смежные вопросы