LinuxForum.Fans
Тема

Простой-Сложный скрипт (ввод и сложение чисел в bash)

Автор: linux_rookie13 8 сообщений 9735 просмотров
#103238

Здравствуйте! Решил плавно перейти на линукс..Знаю некоторые основы,но еще полный пионер! Но дело не в этом.. Мне нужна помощь в написании маленького скрипта(хотя бы структура и команды :rolleyes: ))

Нужно,чтобы скрипт спрашивал сколько ввести чисел(n-ное кол-во штук), затем,чтобы запрашивал ввести пользователя эти числа(n-ное кол-во раз) и сложить их между собой..

как я понимаю,нужно использовать for loop

в и-нете рылся,структуру такую дает:

text

for переменная in 1,2,3...n

do

команда1 команда2 командаN

done

Но как применить это к моей задаче? ( Знаю как это сделать в JavaScripte например,но тут затрудняюсь..не могу сообразить что к чему)
Помогите пожалуйста!))

#103241
linux_rookie13 написал:
1)Нужно,чтобы скрипт спрашивал сколько ввести чисел(n-ное кол-во штук),
затем,чтобы запрашивал
2)ввести пользователя эти числа(n-ное кол-во раз) и сложить их между собой..

1) help read
2a) вам наверное интересно, как сделать in 1 2 3 4 5 6 7, если задано только 7?

doc@dt:~$ seq 7
1
2
3
4
5
6
7

man seq

2б) а ещё - как складывать?

doc@dt:~$ (( x = 17 + 12 ))
doc@dt:~$ echo $x
29

man bash

ну вроде все строительные блоки готовы. Чего не хватает?

#103325

Видимо я не совсем четко сформулировал свой вопрос..мне нужно,чтобы я ввел n-ное кол-во случайных чисел,а программа их всех сложила между собой. ВЫ предоставили мне немного другой скрипт или это я ничего не понимаю?!

#103386
linux_rookie13 написал:
Видимо я не совсем четко сформулировал свой вопрос..мне нужно,чтобы я ввел n-ное кол-во случайных чисел,а программа их всех сложила между собой. ВЫ предоставили мне немного другой скрипт или это я ничего не понимаю?!

1) вводим количество чисел:
read
введённое число оказывается в $REPLY
2) сохраняем количество в $N
N=$REPLY
3) обнуляем сумму
SUMMA=0
4) начинаем цикл
for i in `seq $N`
если мы ввели количество 5, то `seq $N` развернётся в 1 2 3 4 5
5) тело цикла
do
6) ввод i-того числа
read
7) сложение
(( SUMMA = SUMMA + REPLY ))
8) конец тела цикла
done
9) вывод суммы
echo "сумма равна $SUMMA"

Вам это нужно? Видите, я для вас почти всё уже написал ;)

Или вам нужно сначала ввести кучу чисел, а потом их сложить?

Проще всего хранить числа в одной переменной S, разделённые пробелом.
тогда, что-бы добавить к куче чисел очередное число пишите так:
S="$S $RIPLY"
После ввода чисел 12, 5, и 7 переменная примет вид

text
12 5 7

И вот эту переменную мы вставляем после in
for x in $S
тогда, в цикле $x принимает на первой итерации значение 12, на второй 5, а на третьей 7.

Конечно, если у вас bash, то вы можете использовать массивы. Недавно тут была тема про это (с примерами).

#103459
drBatty написал:
[quote=linux_rookie13]Видимо я не совсем четко сформулировал свой вопрос..мне нужно,чтобы я ввел n-ное кол-во случайных чисел,а программа их всех сложила между собой. ВЫ предоставили мне немного другой скрипт или это я ничего не понимаю?!

1) вводим количество чисел:
read
введённое число оказывается в $REPLY
2) сохраняем количество в $N
N=$REPLY
3) обнуляем сумму
SUMMA=0
4) начинаем цикл
for i in `seq $N`
если мы ввели количество 5, то `seq $N` развернётся в 1 2 3 4 5
5) тело цикла
do
6) ввод i-того числа
read
7) сложение
(( SUMMA = SUMMA + REPLY ))
8) конец тела цикла
done
9) вывод суммы
echo "сумма равна $SUMMA"

Вам это нужно? Видите, я для вас почти всё уже написал ;)

Или вам нужно сначала ввести кучу чисел, а потом их сложить?

Проще всего хранить числа в одной переменной S, разделённые пробелом.
тогда, что-бы добавить к куче чисел очередное число пишите так:
S="$S $RIPLY"
После ввода чисел 12, 5, и 7 переменная примет вид

text
12 5 7

И вот эту переменную мы вставляем после in
for x in $S
тогда, в цикле $x принимает на первой итерации значение 12, на второй 5, а на третьей 7.

Конечно, если у вас bash, то вы можете использовать массивы. Недавно тут была тема про это (с примерами).[/quote]

Спасибо огромное!)) очень большая помощь, но мне нужно сначала ввести кучу чисел,чтобы скрипт их сам потом сложил..но думаю,что я уловил мысль))

для того,чтобы скрипт просил ввести числа нужно писать следующее,так?:

echo "Введите кол-во чисел x >"
read x
и потом как то добавить этот x в сам for loop так?)

#103489

#!/bin/sh

echo "Enter how many numbers x>"
read x


for i in x

do

echo "Enter a number i>"
read i

result = result +i
read result

done

echo result

написал такой скрипт, ЗНАЮ,что не хватает $ где их ставить? я не совсем вообще понимаю зачем они нужны.. мысль моя правильна или совсем ерунду горожу?

#103505
linux_rookie13 написал:
for i in x

цикл будет выполнен ОДИН раз. переменной $i будет присвоено значение "x".

linux_rookie13 написал:
result = result +i

(( двойные скобки забыли ))

linux_rookie13 написал:
read result

read - это ввод с клавиатуры.

если написано

read result

то скрипт остановится, и будет ждать, пока вы введёте result

linux_rookie13 написал:
ЗНАЮ,что не хватает $ где их ставить?

везде. перед КАЖДОЙ переменной. Имеются исключения:
1) нельзя ставить перед переменно КОТОРОЙ присваивается значение:

text
X=$Y

переменной $X присваивается значение $Y
(ВНИМАНИЕ! пробелов тут НЕ надо ставить)
2) внутри оператора for

text
for X in 2 12 85 06

Переменной $X присваиваются значения
2
12
85
06
(по одному значению на каждую итерацию)
(на самом деле, это тоже присваивание)
3) внутри оператора read

text
read X

переменной $X присваивается значение, которое вводится с клавиатуры
4) внутри двойных скобок

text
(( X = Y + Z ))

Дело в том, что ((внутри таких скобок)) только цифры.


На самом деле, символ $ нужен для того, что-бы отличить строку X от переменной $X. В тех случаях, когда это и так понятно, символ $ не ставится. Например

text
X=X

Первое X тут переменная, мы просто ничему другому присвоить значение не можем. Второе X здесь - строка. После выполнения оператора, переменная $X станет равной "X".

text
X=$Y

А тут в переменную $X копируется переменная $Y.

#103596
drBatty написал:
[quote=linux_rookie13]for i in x

цикл будет выполнен ОДИН раз. переменной $i будет присвоено значение "x".

linux_rookie13 написал:
result = result +i

(( двойные скобки забыли ))

linux_rookie13 написал:
read result

read - это ввод с клавиатуры.

если написано

read result

то скрипт остановится, и будет ждать, пока вы введёте result

linux_rookie13 написал:
ЗНАЮ,что не хватает $ где их ставить?

везде. перед КАЖДОЙ переменной. Имеются исключения:
1) нельзя ставить перед переменно КОТОРОЙ присваивается значение:

text
X=$Y

переменной $X присваивается значение $Y
(ВНИМАНИЕ! пробелов тут НЕ надо ставить)
2) внутри оператора for

text
for X in 2 12 85 06

Переменной $X присваиваются значения
2
12
85
06
(по одному значению на каждую итерацию)
(на самом деле, это тоже присваивание)
3) внутри оператора read

text
read X

переменной $X присваивается значение, которое вводится с клавиатуры
4) внутри двойных скобок

text
(( X = Y + Z ))

Дело в том, что ((внутри таких скобок)) только цифры.


На самом деле, символ $ нужен для того, что-бы отличить строку X от переменной $X. В тех случаях, когда это и так понятно, символ $ не ставится. Например

text
X=X

Первое X тут переменная, мы просто ничему другому присвоить значение не можем. Второе X здесь - строка. После выполнения оператора, переменная $X станет равной "X".

text
X=$Y

А тут в переменную $X копируется переменная $Y.[/quote]

Спасибо огромное за разъяснение и потраченное время! Вы мне очень помогли!!

( но до сих пор меня мучает один момент..если мы заранее не знаем какие значения примет х, что делать?
например мы знаем,что значению х будут присвоены 5 переменных..нам самим по ходу выполнения скрипта нужно ввести эти 5 чисел,а потом скрипт их сложит..

а если у нас 10 , 34, 50 значений х, что делать? :( )

Войдите или зарегистрируйтесь, чтобы ответить.