获取子shell脚本的返回值

获取子shell脚本的返回值

我有一个 shell 脚本,我在其中启动一个新的 .sh 脚本。现在我想将子脚本的返回值保存在一个变量中。

我找到了这个脚本:

#!/bin/bash
r=1
while [[ r -ne 0 ]]
do
r=`vx $* < \`tty\` > \`tty\``
done
exit 0

它使用参数调用脚本 vx 并将返回值保存在变量 r 中。 tty ... 是什么意思?这是返回值吗?不能用$吗?为了返回值?

谢谢!

编辑:

那么下面的说法会不会是错误的呢?

#!/bin/bash

returnvalue=1

while  [ $returnvalue -ne 0 ]
do
    bash ./vx $1
    returnvalue=$?
done

答案1

我相信你实际上想要:

#! /bin/sh -
until rv "$@"; do
  continue
done

您通常不需要获取退出状态 ( $?) 的实际值,也不需要知道 0 是否表示 true 或 false。until, while, ...结构if可以解决这个问题。上面的内容continue只是为了便于阅读,您可以在其中放置任何命令,包括无操作命令::

永远不要使用$*$@不加引号,这是没有意义的。

答案2

您将把脚本的输出保存在“r”中,退出代码将在$?中。

所以只需在“done”之前添加一行即可

result=$?

答案3

在表达式中

r=`vx $* < \`tty\` > \`tty\``

Bash 解释vx为一个可执行文件名,您可以将$*shell 扩展后传递给当前脚本的所有参数 ( ) 传递给该文件名。例如,如果脚本的参数是,* `ls /dev`则传递给 vx 的参数列表将是当前目录中所有文件的名称加上/dev.参数的数量将与文件名的数量相同。

vx假定接受其标准输入上的输入。

tty是一个可执行文件,它返回 Bash 解释为文件名的字符串。

请注意,第一次调用tty可能会返回与第二次调用不同的文件名,例如,如果tty根据某些外部条件(例如具有前一次调用生成的名称的文件内容)生成文件名,或者根据时间戳或其他可能改变的外部条件。

该表达式r=`...`将反引号命令的标准输出分配给r。反引号表达式的返回值位于 中$?

由于 的标准输出vx被重定向到第二次调用 产生的文件名tty,因此 的值r将始终为空( ),与表达式中的r=相同。结果是循环不会运行多次。r=0[[ r -ne 0 ]]

相关内容