LinuxForum.Fans
Тема

bash скрипт. передача параметров из функции в функцию

Автор: noskovgleb 17 сообщений 8371 просмотров
#276204


Вот небольшой скриптик. Было бы интересно узнать. как принять значение факториала из функции fact в функцию funky, в переменную d.
Подскажите добрые люди, как правильно сделать?

#276213

Во-первых, почему скрипт картинкой показан, а не текстом?
Во-вторых, переменная передаётся точно так же как и скрипту. Пример:

text
#!/bin/bash

function compute() { if [[ "$1" == DEF ]] then echo "$1" fi }

compute DEF

http://www.bash-scripting.ru/abs/chunks/ch23.html#complexfunct

#276215
"Vascom" написал:
Во-первых, почему скрипт картинкой показан, а не текстом?

IMHO, сам скрипт написан с ошибками.

#276239

Во первых вызвать функцию в сценарии можно не раньше чем эта функция объявлена, во вторых команда return может возвращать значение переменной, т.е.

text
#!/bin/bash

foo() { a=2 return $a }

OO() { foo echo $a }

OO

Во третьих перед a и b в выражении нет знака $

#276315

Не очень понимаю как я сделал скрипт, но он работает у меня вот так:

#276322
Vascom написал:
Во-первых, почему скрипт картинкой показан, а не текстом?
Во-вторых, переменная передаётся точно так же как и скрипту. Пример:
text
#!/bin/bash

function compute() { if [[ "$1" == DEF ]] then echo "$1" fi }

compute DEF

http://www.bash-scripting.ru/abs/chunks/ch23.html#complexfunct

Скрипт картинкой потому что Ubuntu на виртуальной машине. Так легче было показать код.

#276324

Ну вообще то return в bash работает не так как в си, он возвращает код завершения команды(0 когда без ошибки, в остальных случаях ошибка)
Пример:

Показать
#!/bin/bash

echo "Введите число"
foo()
{
read a
return $a
}

OO()
{
if ! $(foo); then return 1
fi
}

OO || echo "Ошибка!"

А так думаю нагляднее можно сделать вот так:

text
#!/bin/bash

funky() { echo "Вычисление формулы : f(x,k)=((kx)/(x2))+x!-k!" echo "Введите \$1 : " read a echo "Введите \$2 : " read b arg1=$(fact $a) arg2=$(fact $b) c=$[((a*b)/(a*a))+arg1-arg2] echo $c }

fact() { i=1 j=1 while [ $j -le $1 ]; do i=$[i*j] j=$[j+1] done echo $i return 0 }

funky

#276325

При вызове этого скрипта выводит : Permission denied

#276328
"noskovgleb" написал:
Скрипт картинкой потому что Ubuntu на виртуальной машине. Так легче было показать код.

Чушь. Во-первых, если у вас VirtualBox, установите "дополнения гостевой ОС", а во-вторых, включите в настройках общий буфер обмена.

#276329
"noskovgleb" написал:
При вызове этого скрипта выводит : Permission denied

Значит скрипт не до конца скопировали.
В каком браузере просматриваете?

#276337
"noskovgleb" написал:
При вызове этого скрипта выводит : Permission denied

Права на исполнение дали?

#276344

Ну а вообще, так как тут присутствует операция деления, то точного значения тут не получишь(не работает с вещественными числами), по этому для вычислений лучше использовать bc.
Можно так:

text
#!/bin/bash

funky() { echo "Вычисление формулы : f(x,k)=((kx)/(x2))+x!-k!" echo "Введите \$1 : " read a echo "Введите \$2 : " read b arg1=$(fact $a) arg2=$(fact $b)

c=$(echo "scale=10;(($a*$b)/($a*$a))+$arg1-$arg2"|bc) echo $c }

fact() { i=1 j=1 while [ $j -le $1 ]; do i=$[i*j] j=$[j+1] done echo $i return 0 }

funky

#277335
"ormorph" написал:
во вторых команда return может возвращать значение переменной, т.е.

бред. Попробуйте

text
#!/bin/bash

foo() { a=2 # return $a }

OO() { foo echo $a }

OO

В действительности, return N приводит к выходу из функции, а код N попадает в переменную "статус завершения", доступную через $? По стандарту данный статус является истинной, если =0, иначе ложью. Программисту доступны статусы от 64 до 127 включительно (остальные зарезервированы системой).

#277337
"ormorph" написал:
return 1
поубивал-бы! вернула 1, это значит обычно

1 if minor problems (e.g., cannot access subdirectory),

но на самом деле, просто быдлокодер на всё ставит единички...

#277348
"drBatty" написал:
но на самом деле, просто быдлокодер на всё ставит единички...

Тогда всех слакобилдописателей нужно записать в быдлокодеры:

Показать
text
...
make $NUMJOBS || make || exit 1
...

И так по всему слакбилду.

#277362
"yars" написал:
Тогда всех слакобилдописателей нужно записать в быдлокодеры:

не нужно. Нужно головой думать иногда. Что может сделать вызывающий скрипт, если Slackbuild не смог собрать программу? Не каждый администратор способен распарсить сообщение об ошибке компилятора, не говоря уже о скрипте. Единственный выход - вывалится хоть с какой-нибудь ошибкой. Например 1 - какая-то минорная беда.

А по уму, в таких местах надо писать просто exit без параметра, ошибка была в make, вот пусть её код и возвращается, а не затирается этой единичкой. Но это в общем случае.

#277389
"drBatty" написал:
А по уму, в таких местах надо писать просто exit без параметра

Да, теперь так и буду делать.

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