Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Передача аргументов в функцию bash

#linux #bash


есть функция например 

succes ()
{
echo "OK"
}

succes


можно ли сделать вот так ?

succes (var3)
{
echo $var3
}

succes("OK")

    


Ответы

Ответ 1



Можно передавать параметры. Вызов будет: succes "OK" А обращение к параметрам succes () { echo $1 } Функция обращается к переданным ей аргументам основываясь на их позиции. Т.е. это позиционные параметры

Ответ 2



вообще информацию в функцию (и в сам скрипт в том числе) можно передавать (как минимум) четырьмя путями: аргументами (позиционными параметрами) переменными окружения содержимым стандартного потока ввода stdin содержимым файлов вот скрипт, демонстрирующий первые три пути: f1() { echo "вызов '$FUNCNAME' номер $1, второй аргумент равен '$2', переменные: var1='$var1', var2='$var2'" } f2() { read var1; echo "вызов '$FUNCNAME' номер $1, в stdin передан '$var1'" } var1="общая" f1 один var1="переопределённая" var2="непосредственная" f1 два echo "текст" | f2 один var2="непосредственная" f1 три 42 вот результат его запуска: вызов 'f1' номер один, второй аргумент равен '', переменные: var1='общая', var2='' вызов 'f1' номер два, второй аргумент равен '', переменные: var1='переопределённая', var2='непосредственная' вызов 'f2' номер один, в stdin передан 'текст' вызов 'f1' номер три, второй аргумент равен '42', переменные: var1='общая', var2='непосредственная'

Ответ 3



Нет, ну передачей аргументов в функцию собственно называется передача их в списке вызова, а не как-то ещё. Внешние аргументы, интерактивное чтение из stdin или другого файла - это не передача данных в функцию, а способ получения данных независимо от того, где этот код написан. Автор видимо не понимает, что это такое - передача аргументов в функцию... ну да ладно! Так что из его 4-х способов фактически остаётся только 1 - позиционные параметры. Вопрос состоял в том, можно ли передавать именованные параметры. Ответ - нет. Это не предусмотрено в современном синтаксисе bash скрипта. Может быть в последующих версиях. Количество параметров - тоже не слишком много. Это не мильён точно... Но штук 20 передать можно. Я больше не пробовал. Вы можете проверить. Но боюсь это не стабильный параметр. Определены так же переменные $# - кол-во аргументов и список $@. Параметр $0, тем не менее, означает не имя функции, как могло бы показаться, а имя скрипта. Это отличие! Эти аргументы не readonly. Т.е. вы их можете менять, сдвигать список с помощью shift. правда на внешнем окружении это не скажется... Сложно будет даже синтаксически поменять позиционный параметр, ибо по правилам синтаксиса bash вам придётся записать что-то типа 1=новое_значение, что немедленно вызовет ошибку, ибо 1 будет восприниматься не как имя переменной, а как число. Странно что это не заложено в синтаксисе. Но если использовать eval, то можно. Но не нужно, кроме случая, если вы не используете ещё один способ передачи аргумента в функцию: косвенную ссылку с изменением её значения внутри функции. В целом такой механизм bash не предусматривает, но запрета нет. Поэтому путём манипуляций вы это можете проделать. Хотя это скорей похоже не на нормальный код, а на некое шаманство. Но всё же работает. Код плохо понимаем, но так можно делать. Это не для новичков, говорю сразу. Было бы забавно, если бы конструкция типа 1=verry сработала, в смысле что мы умудрились поменять само число 1... Я не знаю, как стала бы работать после этого программа, скорей всего никак, или началась бы жутко непонятное поведение. Это конечно недопустимо, единицу менять нельзя. А такое в практике программирования встречалось уже. Помню в первых версиях фортрана можно было поменять даже ноль... Программа просто вылетала! Причём совершенно непонятно почему... Как говорится всяко бывает.

Комментариев нет:

Отправить комментарий