繁体   English   中英

使用bash脚本从变量中的函数返回多个值

[英]Returning multiple values from a function in variables using bash script

我发现以下代码可以从 bash 中的函数返回多个变量:

#!/bin/bash
calc()
{
  A=$1
  B=$2
  total=$(( A + B ))
  diff=$(( A - B ))
  echo "$total $diff"
}
read TOT DIF < <(calc 5 8)
echo $TOT
echo $DIF

但是当我运行脚本时,我得到以下信息:

第 10 行:意外标记“<”附近的语法错误

任何想法如何解决这个问题? 我在控制台中尝试了相同的代码并且它有效,问题是当我从文件运行它时: sh myScript.sh

您可以通过这种替代方式在非 bash shell 中工作:

#!/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"

set参数内的子 shell 中调用calc函数的一个主要缺点是函数的 shell 返回码的丢失。

这意味着由calc函数来处理错误情况,比如被零除。

例如:它可以在返回的 IFS 分隔值中合并一个返回码。

但这意味着错误处理要复杂得多。

我不建议在非 bash shell 下以这种方式实现多个返回值。

对于 Bash shell 而言,将多返回实现为 ASCII EOT 分隔字符串仍然是一个有效的选项,因为在按以下方式读取和拆分返回的字符串时会保留 shell 的返回码:

#!/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

您正在使用sh myScript.sh显式运行它。 在这种情况下,shebang #! 被忽略,因为它是对 shell 的注释。

Shebangs 由程序加载器检测而不是每个单独的 shell。 如果您将程序作为./myScript.sh运行(假设它被标记为可执行文件),程序加载器将检测到 shebang 并将操作自动转换为/bin/bash myScript.sh

换句话说,要么使用你想要运行它的特定shell(在这种情况下是bash ),要么让加载器来处理它(见上一段)。

例如,这是使用三种不同方法运行的代码的抄本(特别是sh ,特别是bash ,并让加载程序接管它 - 只有第一个失败):

pax$ sh qq.sh
qq.sh: 10: qq.sh: Syntax error: redirection unexpected

pax$ bash qq.sh
13
-3

pax$ ./qq.sh
13
-3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM