http://s017.radikal.ru/i443/1209/bf/254ecdea78b2.jpg
Вот небольшой скриптик. Было бы интересно узнать. как принять значение факториала из функции fact в функцию funky, в переменную d.
Подскажите добрые люди, как правильно сделать?

2 (24.09.2012 09:43:58 отредактировано Vascom)

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

#!/bin/bash

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

compute DEF

http://www.bash-scripting.ru/abs/chunks … mplexfunct

3

Vascom пишет:

Во-первых, почему скрипт картинкой показан, а не текстом?

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

Был, был и весь вышел...

4 (24.09.2012 12:39:39 отредактировано ormorph)

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

#!/bin/bash

foo()
{
  a=2
  return $a
}

OO()
{
  foo
  echo $a
}

OO 

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

5

Не очень понимаю как я сделал скрипт, но он работает  у меня вот так:
http://s019.radikal.ru/i601/1209/92/ca1aff850a47.png

6

Vascom пишет:

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

#!/bin/bash

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

compute DEF

http://www.bash-scripting.ru/abs/chunks … mplexfunct

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

7 (24.09.2012 18:48:09 отредактировано ormorph)

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

+ открыть спойлер

#!/bin/bash

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

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

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

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

#!/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

8

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

9

noskovgleb пишет:

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

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

10

noskovgleb пишет:

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

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

11

noskovgleb пишет:

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

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

Да, у меня Ubuntu.
Нет, не глючит.

12 (24.09.2012 21:13:42 отредактировано ormorph)

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

#!/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

13

ormorph пишет:

во вторых команда return может возвращать значение переменной, т.е.

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

#!/bin/bash

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

OO()
{
  foo
  echo $a
}

OO

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

14

ormorph пишет:

return 1

поубивал-бы! вернула 1, это значит обычно

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15 (01.10.2012 14:30:25 отредактировано yars)

drBatty пишет:

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

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

+ открыть спойлер
...
make $NUMJOBS || make || exit 1
...

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

16

yars пишет:

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

17

drBatty пишет:

А по уму, в таких местах надо писать просто exit без параметра

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580