将命令的输出分配给变量

时间:2013-12-19 17:58:30

标签: bash unix sh

我是unix的新手,我正在编写一个shell脚本。

当我在命令提示符下运行此行时,它会打印匹配的进程数的总计数:

ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'

示例,命令提示符中上面一行的输出为2。

我想写一个shell脚本,其中上面一行(2)的输出被分配给一个变量,稍后将在if语句中用于比较。

我正在寻找像

这样的东西
output= `ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'`
echo $output

但是当我运行它时,它表示无法找到输出,而我期待2.请帮助。

3 个答案:

答案 0 :(得分:95)

您可以使用$标志,如:

OUTPUT=$(expression)

答案 1 :(得分:14)

尝试:

output=$(ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'); echo $output

$( )中包装命令会告诉shell运行该命令,而不是尝试将命令本身设置为名为“output”的变量。 (注意,您也可以使用反引号`命令`。)

我强烈建议http://tldp.org/LDP/abs/html/commandsub.html了解有关命令替换的更多信息。

此外,正如1_CR在注释中正确指出的那样,等号和赋值之间的额外空格导致它失败。这是我的机器上您遇到的行为的一个简单示例:

jed@MBP:~$ foo=$(ps -ef |head -1);echo $foo
UID PID PPID C STIME TTY TIME CMD

jed@MBP:~$ foo= $(ps -ef |head -1);echo $foo
-bash: UID: command not found
UID PID PPID C STIME TTY TIME CMD

答案 2 :(得分:8)

如果您想使用multiline / multiple命令执行此操作,则可以执行以下操作:

output=$( bash <<EOF
#multiline/multiple command/s
EOF
)

或者:

output=$(
#multiline/multiple command/s
)

示例:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

输出:

first
second
third