LINUX.ORG.RU
ФорумAdmin

Реализация на -sh

 


0

3

Подскажите, как реализовать такой алгоритм: Нужно чтобы в условии проверки можно было вызвать функцию с передачей ей параметра.

Допустим ф. суммы двух чисел - sum.

if [ (sum 3 2) = 5]; then

fi

И возможно ли вообще такое?

Ответ на: комментарий от Spoofing

Ну за сумму я написал «допустим»... А если функция написана отдельно и она слишком большая, чтобы засунуть все в условие?

alexey995
() автор топика
Ответ на: комментарий от alex_the_v

Интересное решение. Спасибо!

Народ, вопрос был не в сложении двух чисел, а в получении значения, возвращаемое функцией. Ф. sum была как пример).

alexey995
() автор топика
Ответ на: комментарий от zolden

Нет, ну зачем-же так сразу. Есть ведь пёрл и пистон. Не вижу ничего дурного в том что-бы использовать их если в sh становится тесновато.

MrClon ★★★★★
()
Ответ на: комментарий от beastie

Ну вот зачем так издеваться над языком для инициализации системы?

Но в инициализации моей системы нет такого языка. Это в какой системе так?

d_a ★★★★★
()

Выше по треду предложили $(…).

$(…) форкается, что 1) очень медленно; 2) лишает возможности модификации глобальных переменных; 3) и ещё много чего. А ещё $(…) обрезает переводы строки в конце.

Без форков можно сделать так: функция пишет ответ в _ans (либо валится с ненулевым кодом), а ret принимает переменную и функцию[+аргументы], запускает их и присваивает переменной значение _ans — в bash это можно сделать через ссылку на переменную (declare -n), в sh — через eval (который, к счастью, не форкается). Это работает и с вложенными вызовами.

Warning: не нужно подсовывать ret имена переменных, начинающиеся с “_” — конкретная реализация (напр. для sh) может использовать их.

bash:

ret() {
    declare -n _ans=$1
    "${@:2}"
}
sh:
ret() {
    local _ans _var=$1
    shift
    "$@" || return "$?"
    eval "$_var"'=$_ans'
}

И теперь:

sum() {
    _ans=$(( $1 + $2 ))
}

ret myvar sum 3 2
if [ "$myvar" -eq 5 ]; then
    …
fi
В качестве дополнительного наркоманства можно заменить ret на, скажем, “⇒” — как бэ «вот в эту переменную» — bash поддерживает юникондые названия функций.

shdown
()
Ответ на: комментарий от alex_the_v

В данном случае лучше всё условие вынести в функцию. В if оставить только $(branch 1 2 3).

Ибо так условие выглядит как мусор, да и в условиях задачи ТС подразумевал предикат, а не конкретный код.

ziemin ★★
()
Ответ на: комментарий от ziemin

Хм?

NAME
       sum - checksum and count the blocks in a file

Это повод совершать глупые ошибки в написании слов? Если ты намекаешь на то, что может понадобиться вызвать этот бинарник, а не одноимённую функцию, то его можно вызвать с помощью command sum ….

shdown
()
Ответ на: комментарий от alexey995
foo()
{
...
  echo bar
...
  echo fuck
}
...

if [ "$(foo)" = bar ]; then
...
fi
...
anonymous
()
Ответ на: комментарий от zolden

для сложения двух чисел надо юзать go или rust, в крайнем случае erlang

Только сишечка, только хардкор!

Stil ★★★★★
()
Ответ на: комментарий от shdown

то его можно вызвать с помощью command sum ….

Начинаешь юлить. Тебе предъявили простой вариант, а ты начинаешь городить какие-то command'ы лишь бы не согласится. Представь что он назвал так подпрограмму по аналогии с «sum_». И вообще, может он во вложенных циклах использует в качестве имён итераторов «a0», «Th12», «Phi»...

Будешь холивар устраивать из-за имён итераторов?

ziemin ★★
()
Ответ на: комментарий от ziemin

Тебе предъявили простой вариант

Где предъявили? Вариант чего? Решения с форком? Да. Я только указал на ошибку в названии функции (слова summ в английском языке не существует). Ты точно ответил на тот комментарий, на которых хотел?

Представь что он назвал так подпрограмму по аналогии с «sum_». И вообще, может он во вложенных циклах использует в качестве имён итераторов «a0», «Th12», «Phi»...

Вообще ничего не понял.

shdown
()
Ответ на: комментарий от shdown

Вообще ничего не понял

Вот в этом-то и проблема. Кажется мелочь, но из мелочей складывается всё на свете.

Мой тебе совет: постарайся избегать этого словосочетания. Лучше «разберусь!».

ziemin ★★
()
Ответ на: комментарий от beastie

как можно доверить инициализацию системы шеллоскриптоте?

anonymous
()
Ответ на: комментарий от shdown

Итераторы у него в баше, вообще офигеть.

Я не знаю, чем какают в твоём мире пони, но в реальности итераторы выглядят вот так:

for a0 in 1
  do
    for Th12 in 1
      do
        for Phi in 1
          do
            echo $a0$Th12$Phi
          done
      done
  done
ziemin ★★
()
Ответ на: комментарий от ziemin

fiesh suggested adding this form of looping. It's a for loop more similar to C/perl... for.

        #!/bin/bash
        for i in `seq 1 10`;
        do
                echo $i
        done

Мде. Про for (( i = 1; i <= 10; ++i )) они, конечно, не слышали. Зато какие-то HOWTO составляют.

Ладно. Допустим. К чему ты их (итераторы) упомянул? К чему ты написал «man sum» на моё замечание об орфографической ошибке?

Алсо, мне всё-таки удалось распарсить одну из твоих фраз:

Представь что он назвал так подпрограмму по аналогии с «sum_».

Да нет же, он просто думает, что если в русском — «сумма», то и в английском аналогично.

Тебе предъявили простой вариант, а ты начинаешь городить какие-то command'ы лишь бы не согласится.

Где предъявили? Вариант чего? Ты про sum() { echo $(($1 + $2)); }? Да, только оно форкается. Я предположил, что ты своим man sum имел в виду, что есть некоторый бинарник, который называется sum, и что объявлять функцию с таким же именем плохо; я же тебе пояснил, что бинарник, даже если одноимённая функция уже определена, можно вызывать с помощью command.

И вообще, может он во вложенных циклах использует в качестве имён итераторов «a0», «Th12», «Phi»...

К чему это вообще?

shdown
()
Ответ на: комментарий от shdown

Ты, жывотное!! Ты даже не понимаешь, что у сущности может быть имя!!!

ziemin ★★
()
Ответ на: комментарий от ziemin

Это смотря что делать. ТСу было интересно как вернуть значение из функции и таким образом использовать вызов функции в ветвлении. Мой пример именно это и показывает. А так - да, можно было сделать двадцатью разными способами, причем некоторые из них будут элегантнее (я, например, согласен с каждым словом товарища shdown), только топик не об этом.

alex_the_v ★★★
()
Ответ на: комментарий от shdown

Угу, давай, поучи меня английскому. Я имел в виду именно summ. Кто тебе сказал, что переменные должны называться именно словами английского языка?

Как стреляный воробей я рефлекторно избегаю называть переменные общеупотребительными словами типа sum (однако, не хочу никому навязывать эту практику), чтобы избежать пересечения имен с каким-нибудь билт-ином или еще чем похуже. Например, можно нехило пройтись по граблям в питоне, если называть поля в классах именем id, а можно и не пройтись в зависимости от ситуации.

Кроме того, я мог иметь в виду не sum, а summation, что вполне имеет смысл как название для этой функции.

alex_the_v ★★★
()
Последнее исправление: alex_the_v (всего исправлений: 1)
Ответ на: комментарий от alex_the_v

Я имел в виду именно summ.

Не верю.

Как стреляный воробей я рефлекторно избегаю называть переменные общеупотребительными словами типа sum (однако, не хочу никому навязывать эту практику), чтобы избежать пересечения имен с каким-нибудь билт-ином или еще чем похуже

В баше это не нужно:

       builtin shell-builtin [arguments]
              Execute the specified shell builtin, passing it arguments, and return its exit status.  This is useful when defining a function whose name is the same
              as a shell builtin, retaining the functionality of the builtin within the function.  The cd builtin is commonly redefined this way.  The return status
              is false if shell-builtin is not a shell builtin command.
       command [-pVv] command [arg ...]
              Run command with args suppressing the normal shell function lookup. Only builtin commands or commands found in the  PATH  are  executed.   If  the  -p
              option  is  given,  the  search  for command is performed using a default value for PATH that is guaranteed to find all of the standard utilities.  If
              either the -V or -v option is supplied, a description of command is printed.  The -v option causes a single word indicating the  command  or  filename
              used  to  invoke command to be displayed; the -V option produces a more verbose description.  If the -V or -v option is supplied, the exit status is 0
              if command was found, and 1 if not.  If neither option is supplied and an error occurred or command cannot be found, the exit status is  127.   Other‐
              wise, the exit status of the command builtin is the exit status of command.

shdown
()
Ответ на: комментарий от shdown

Не верю.

Вот как мне на это ответить? Типа «блин, чувак, я не ведаю что творю»? Придется тебе поверить =)

В баше это не нужно

Я ж там приписал: рефлекторно. Это проще, чем запоминать в каком языке как грабли разложены. К тому же, я уже две недели клепаю кастомные метрики для Нагиоса под винду на вбскрипте и скармливаю их в паппет, приколись что у меня сейчас в башке творится. Еще неделя этого насилия, потом пойду в отпуск на недельку и буду добросовестно бухать пока это говно из головы не выветрится спиртовыми парами.

Забей, короче. Хочешь sum - пусть будет sum, не вижу препятствий.

alex_the_v ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.