[英]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.