![获取子shell脚本的返回值](https://linux22.com/image/29310/%E8%8E%B7%E5%8F%96%E5%AD%90shell%E8%84%9A%E6%9C%AC%E7%9A%84%E8%BF%94%E5%9B%9E%E5%80%BC.png)
我有一个 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 ]]