В чем проблема с моим кодом для умножения двух чисел по-разному с помощью Bash? - PullRequest
0 голосов
/ 04 августа 2011

Я впервые использую Bash, так что терпите меня. Я использую Git Bash в Windows для проекта колледжа, пытаясь переписать некоторый код C, который предоставляет альтернативный способ умножения двух чисел «a» и «b» для получения «c». Вот что я придумал:

#!/bin/bash

declare -i a
declare -i b
declare -i c=0
declare -i i=0    # not sure if i have to initialize this as 0?
echo "Please enter a number: "
read a
echo "Please enter a number: "
read b

for i in {1..b}
do
    let "c += a"
done

echo "$a x $b = $c"

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

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Есть проблемы с вашей петлей:

  • Вы не можете использовать {1..b}.Даже если бы у вас было {1..$b}, это не сработало бы, потому что вам понадобится eval.Вместо этого проще всего использовать команду seq.
  • Ваш синтаксис let неверен.

Попробуйте:

for i in $(seq 1 $b)
do
    let c+=$a
done

Кроме того, этонеобходимо объявить или инициализировать i.

1 голос
/ 04 августа 2011

для i в {1..b}
не будет работать, потому что 'b' не интерпретируется как переменная, а символ для итерации.
Например, {a..c} раскрываетсядо ab c.
Чтобы заставить работать расширение скобок:
для i in $ (eval echo "{1 .. $ b}")

Пусть let "c + = a" также не будет работать.
пусть c + = $ a может работать, но мне нравится ((c + = a)) лучше.

Другой способ таков:
for ((i = 1; i <= b; i++))<br> do<br> ((c += a))<br> done

( может потребоваться поместить #! / bin / bash в начало вашего скрипта, потому что sh делает меньше, чем bash.)

0 голосов
/ 04 августа 2011

Конечно, в bash уже есть умножение, но я думаю, вы знали, что ...

Если ваша проблема заключается в отсутствии seq, вы можете заменить его на что-нибудь более переносимое, например

c=0

# Print an endless sequence of lines
yes |
# Only take the first $b lines
head -n "$b" |
# Add line number as prefix for each line
nl |
# Read the numbers into i, and the rest of the line into a dummy variable
while read i dummy; do
    # Update the value of c: add line number
    c=`expr "$c" + "$i"`
    echo "$c"
done |
# Read the last number from the while loop
tail -n 1

Это должно быть переносимо на любую Bourne-совместимую оболочку. Трюк while ... echo ... done | tail -n 1 необходим, только если значение c не экспортируется за пределы цикла while, как это имеет место в некоторых, но не во всех оболочках Bource.

Вы можете реализовать замену seq однострочным Perl, но тогда вы можете написать все это на Perl (или awk, или Python, или что у вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...