× К оглавлению На главную Об авторе

   Дата и время публикации:

Проблема и решение

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

3.2 LinuxHints.Com. Howto return string bash functions

3.3 TLDP HOWTOS. Bash Programming Introduce