Функции Bash обычно «возвращают» значения, печатая их на стандартный вывод, где вызывающий может захватить их, используя
`func args ...`
или
$(func args ...)
Это заставляет функции работать как внешние команды.
Оператор return
, с другой стороны, устанавливает значение $?
. Обычно это будет установлено на 0 для успеха, 1 для сбоя или какое-то другое значение для указанного типа сбоя. Думайте об этом как код состояния, а не общее значение. Вполне вероятно, что это будет поддерживать только значения от 0 до 255.
Попробуйте вместо этого:
#!/bin/sh
div3() {
expr $1 % 3 = 0 # prints "0" or "1"
}
d=$(div3 1)
echo $d
Обратите внимание, что я также изменил строку Шебанга с #!/usr/bin/env sh
на #!/bin/sh
. Трюк #!/usr/bin/env
часто используется при вызове интерпретатора (например, perl
), который вы хотите найти с помощью $PATH
. Но в этом случае sh
будет , всегда будет в /bin/sh
(система сломалась бы различными способами, если бы не было). Единственная причина написать #!/usr/bin/env sh
состоит в том, что вы хотите использовать любую команду sh
, которая появляется первой в вашем $PATH
, а не в стандартной. Даже в этом случае вам, вероятно, лучше указать путь к sh
напрямую.