bash shell的返回值

时间:2019-04-27 13:40:39

标签: bash telnet

我正在尝试学习linux bash脚本。我有一个脚本,我想获取此脚本的返回值并将其存储在变量中。

欢迎任何帮助。

先谢谢您。

#!/bin/bash
HOST_NAME=$1

{ echo "105" ; sleep 5; } | telnet $HOST_NAME 9761;

4 个答案:

答案 0 :(得分:3)

为避免混淆,请勿将其视为返回值,而应将其视为退出状态。

在大多数编程语言中,您可以通过捕获函数在变量中返回的任何内容来捕获函数的返回值,例如使用类似C的语言:

int foo() {
    printf("35\n");
    return 7;
}

void main() {
    int var;
    var=foo();
}

调用varmain()中的变量foo()将保存值7,并且35将被打印到stdout。在外壳中,但是具有类似的代码:

foo() {
    printf "35\n"
    return 7
}

main() {
    local var
    var=$(foo)
}

var的值为35,未提及的内置变量$? 始终保持上一次运行命令的退出状态的值为{ {1}}。如果要复制C行为,其中35转到标准输出,而var包含7,则为:

7

如果您习惯使用其他基于Algol的语言(例如C),那么外壳函数使用关键字foo() { printf "35\n" return 7 } main() { local var foo var=$? } 来报告其退出状态的事实一开始令人困惑,但是如果它们使用了return,那么它就d终止了整个过程,所以他们不得不使用某些东西,这很快就明白了它的真正含义。

因此,在处理shell脚本和函数时,请使用“输出”和“退出状态”,而不是“返回”,在某些情况下,某些人会假设这两个意思是其中之一,这样可以避免所有混淆。

为避免使事情变得更加复杂,我在上面说过exit是一个变量,但实际上它是“特殊参数” $?的值。如果您现在真的想了解它们之间的区别,请参阅https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters,以获取有关shell参数的讨论,其中包括诸如??之类的“特殊参数”,诸如{{1 }}和#,以及上面的脚本中使用的“变量”,例如12

答案 1 :(得分:1)

$? shell变量存储返回值,但是对于Linux telnet客户端,这可能没有您想象的有用。如果远程主机关闭连接(或者发生任何远程或网络错误),客户端将返回1,如果本地客户端成功关闭连接,则客户端将返回0。问题在于编写了许多服务,以便它们发送数据,然后自己关闭TCP连接,而无需等待客户端:

$ telnet time-b.timefreq.bldrdoc.gov 13
Trying 132.163.96.2...
Connected to time-b-b.nist.gov.
Escape character is '^]'.

58600 19-04-27 13:56:16 50 0 0 736.0 UTC(NIST) *
Connection closed by foreign host.
$ echo $?
1

即使客户端向服务器发送命令以通过TCP流退出,这仍然会导致远程端关闭连接,结果相同:

$ telnet mail.tardis.ed.ac.uk 25
Trying 193.62.81.50...
Connected to isolus.tardis.ed.ac.uk.
Escape character is '^]'.
220 isolus.tardis.ed.ac.uk ESMTP Postfix (Debian/GNU)
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
$ echo $?
1

因此,无论您做什么,您都会得到1。如果您想要远程脚本的返回值,可以使用ssh这样更容易:

$ ssh ssh.tardis.ed.ac.uk "exit 5"
THE TARDIS PROJECT  |  pubpubpubpubpubpubpubpubpub  |  Authorised access only
$ echo $?
5

据我所知,telnet唯一一次返回零(即成功)的时间就是您是否逃脱了,并且完全是客户端,就像这样:

$ telnet www.google.com 80
Trying 216.58.210.36...
Connected to www.google.com.
Escape character is '^]'.
^]

telnet> quit
Connection closed.
$ echo $?
0

希望这会有所帮助。

答案 2 :(得分:1)

这取决于您所说的返回值

进程(在类似UNIX的系统上)可以将一个无符号字节作为退出状态返回到外壳程序,因此其值的范围为0-255。按照惯例,零表示成功,其他任何值表示失败。

(在像C这样的低级语言中,您不仅可以获得退出状态,而且在bash中看不到)。

上次运行命令的退出状态存储在变量?中,因此您可以从$?中获取其值,但是由于许多程序只返回0(工作)或1(工作)没用),那么用处不大。

Bash等条件,例如ifwhile测试是否成功(退出代码为0)或失败(退出代码为非零):

if some-command
then
    echo "It worked"
else
    echo "It didn't work"
fi

但是....

如果您要从脚本中获取输出,那是另一回事。您可以使用以下命令捕获它:

var=$(some-command)

但是,等等,那只能捕获路由到名为stdout(文件描述符1)的流的正常输出,它不能捕获大多数程序写到名为stderr(文件描述符)的流的错误消息。 2)。为了捕获错误,您还需要将文件描述符2重定向到文件描述符1:

var=$(some-command 2>&1)

输出文本现在位于变量var中。

答案 3 :(得分:0)

?变量始终存储上一个命令的退出代码。

您可以使用$?来检索值。

某些上下文:http://tldp.org/LDP/abs/html/exit-status.html