如何在Unix中将shell脚本的输出存储到变量中?

48

我有一个shell脚本"script.sh",在Unix窗口中执行时会输出"success"或"Failed"。现在我想将script.sh的输出存储到Unix命令变量中。 say $a = {script.sh的输出}


可能是shell脚本无法将命令行输出保存到变量中的重复问题。 - Charles Duffy
与在ksh中将命令输出重定向到变量和标准输出几乎相同。 - Dan Dascalescu
5个回答

97

两个简单的例子来捕获pwd命令的输出:

$ b=$(pwd)
$ echo $b
/home/user1
或者
$ a=`pwd`
$ echo $a
/home/user1

首选第一种方法。请注意,此方法无法在 = 后面添加任何空格。

以下是使用简短脚本的示例:

#!/bin/bash

echo "hi there"

那么:

$ ./so.sh
hi there
$ a=$(so.sh)
$ echo $a
hi there

一般来说,更灵活的方法是从命令中返回一个退出值并将其用于进一步处理,尽管有时我们只想捕获命令的简单输出。


是的,它返回一个字符串。我只想将该值存储到 $a 中。 - logan
一个命令可以被 script.sh 替换吗?例如:$a=script.sh,这样会将 script.sh 的输出存储在 $a 中吗? - logan

7
假设你想要存储echo命令的结果。
echo hello   
x=$(echo hello)  
echo "$x",world!  

输出:

hello  
hello,world!

@NitsanBaleli 这是一个回答,不是一个问题。 - jean

4

你最好重写脚本,让其返回一个值而不是直接输出。可以将以下代码改为:

a=$( script.sh ) # Now a is a string, either "success" or "Failed"
case "$a" in
   success) echo script succeeded;;
   Failed) echo script failed;;
esac

您将能够做到:

if script.sh > /dev/null; then
    echo script succeeded
else
    echo script failed
fi

如果其他程序不需要解析输出,那么它们与您的脚本一起工作就会更加简单。这是一个简单的更改。只需使用exit 0而不是打印 success,并且使用exit 1而不是打印 Failed。当然,您也可以打印这些值并使用合理的返回值退出,以便包装脚本可以根据需要灵活处理脚本。


顺便提一下,在任何真正的代码中,您都需要使用“成功”和“失败”(请注意一致的大写),否则事情很快就会变得混乱。 - anon

3
export a=$(script.sh)

希望这能帮到你。请注意变量和“=”之间没有空格。要输出内容,请使用echo命令。
echo $a

脚本什么时候会执行?是在提交 echo $a 后还是在 export 后? - logan
你为什么要导出 a?在 echo 语句中应该使用双引号来包含 $a - Sven Marnach
@login 将在子shell中运行脚本并等待其退出,该子shell的流将指向变量"a",这意味着它们输出的所有内容都将被写入该变量,而不是您主要shell的标准输出。 - Jeffrey Vandenborne
1
@SvenMarnach 我不知道 OP 想要如何使用这个变量,导出可以使其在子进程中可用。 - gandalf007
2
@logan $(command) 是一种运行命令并捕获输出的方式。 - gandalf007

0
你需要在脚本前加一个句点,这将把导出的变量放入当前环境中。
#!/bin/bash
...
export output="SUCCESS"

然后像这样执行它

chmod +x /tmp/test.sh
. /tmp/test.sh

当您需要整个输出而不仅仅是单个值时,只需像其他答案所示将输出放入变量中即可。


当使用源代码时,没有“导出”的必要。此外,对于仅有一个值的情况,退出状态或标准输出似乎更加合理。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接