Дата и время публикации:
Проблема и решение
1. Суть проблемы
На первый взгляд возврат текстовой строки из функциях сценариев SHELL не такая простая штука, но может с тем породить нелепые сообщения типа "./retext.sh 40: return: Illegal number: Hello world", из-за неверно написанного сценария возврата текстовой строки из функции, как показано в листинге 1.1
Листинг 1.1
01 #!/bin/bash 02 03 # define the SHELL common variables ... 20 # define the SHELL common functions ... 40 do_retmsg() 41 { 44 return "Hello world" 45 } ... 100 do_retmsg 101 echo "text: $?" ...
В отличии от языка программирования GNUC, указанные сценарии имеют возможность группировать в отдельные группы последовательности выполнения команд, операторов, выделение переменных и присвоение им значений, реализующие определенную функциональность, но при этом они не могут возвращать значения в виде текстовой строки.
Поэтому существуют обходные пути решения данной проблемы.
2. Решение
2.1 Использование переменной SHELL
Самый простой и распространенный способ возврата текстового значения, передача через переменную SHELL, как показано в листинге 2.1.1
Листинг 2.1.1
#!/bin/bash # define the SHELL common variables ... # define the SHELL common functions ... do_hello_world() { retvalue="hello world!" } ... do_hello_world echo "text: $retvalue"
При этом, как показано в листинге 2.1.1, не нужно объявлять значение переменной retvalue=, как это делается в языках программирования, наподобие GNUC , как и так же любая переменная, объявленная внутри функции в сценариях SHELL не будет являться локальной.
2.2 Передача через 1-й аргумент функции SHELL
Следующий мало распространенный способ – передача через первый аргумент функции, который показан в листинге 2.2.1
Листинг 2.2.1
#!/bin/bash # define the SHELL variables ... # define the SHELL functions ... do_return_value() { [ $# -ge 1 ] $1="return value" return 121 } ... retext=' ' do_return_value echo "text: $retext $?" ...
Как показано в листинге 2.2.1, функция производит возврат двух значений целочисленного и текстового . При этом последнее значение она возвращает в первом своем аргументе, а целочисленное через оператор return .
2.3 Передача через стандартный вывод (stdout)
Но, самый простой и элегантный способ, не требующий лишних телодвижений, является передача текстовой строки через stdout, как показано в листинге 2.3.1
Листинг 2.2.1
#!/bin/bash # define the SHELL variables ... # define the SHELL functions ... do_hello_world() { echo "hello world!" } ... retext=$( do_hello_world ) echo "text: $retext" ...
В нем, c использованием команды echo, текстовая строка передается через stdout, как показано в листинге 2.3.1
2.4 О Бытие и истины
Резюмируя выше сказанное, нужно запомнить две простые истины Бытия, что функция может возвращать только целочисленное значение, а текстовая строка передаваться через стандартное устройство вывода stdout.
3. Библиография
3.1 StackOverFlow. How to return a string value from a bash function