Вы могли бы сделать это альтернативным способом работы в не bash оболочке:
#!/bin/sh
calc()
{
A="$1"
B="$2"
total=$(( A + B ))
diff=$(( A - B ))
# Return ASCII EOT (code 3) separated values
printf '%d\3' "$total" "$diff"
}
# Configure the Internal Field Separator to ASCII 03 End Of Text
IFS="$(printf '\3')"
# shellcheck disable=SC2046 # Intentionally split values
# Sets the arguments from the returned string
set -- $(calc 5 8)
TOT="$1"
DIF="$2"
echo "$TOT"
echo "$DIF"
Один главный недостаток вызова функции calc
в под-оболочке в аргументах set
, - потеря кода возврата оболочки функции.
Это означает, что до calc
функции приходится иметь дело с ошибочными ситуациями, такими как деление на ноль.
Например, : Он может включать код возврата в возвращенные значения, разделенные IFS.
Но это означает, что обработка ошибок намного сложнее.
Я бы не рекомендовал реализовывать несколько возвращаемых значений таким образом при отсутствии - bash shells.
Это все еще допустимый параметр для оболочки Bash для реализации множественного возврата в виде строки с разделителем EOT ASCII, поскольку код возврата оболочки сохраняется при чтении и разбиении возвращаемого значения. строка следующим образом:
#!/usr/bin/env bash
# Call calc and parse returned split string into values
IFS=$'\3' read -r TOT DIF < <(calc 5 3)
# Save calc's return-code
_rc="$?"
# The return-code from the calc function is preserved
# and can be tested
if [ $_rc -ne 0 ]; then
printf 'calc failed with return-code %d\n' "$_rc" >&2
else
echo "$TOT"
echo "$DIF"
fi