将jps -vl命令的输出分配给shell脚本中的变量

时间:2017-09-30 10:48:40

标签: linux bash shell command-line sh

我需要将命令的输出分配给变量。我试过的命令是:

 #!/bin/bash
 JAVA_PROCESSES=`jps -vl | grep -v 'sun.tools.jps.Jps' | grep -v 'hudson.remoting.jnlp.Main' | grep -v grep`
 NUMBER_OF_JAVA_PROCESSES=`echo $JAVA_PROCESSES | wc -l`
 echo $NUMBER_OF_JAVA_PROCESSES
 echo $JAVA_PROCESSES
 ..

当我按上面的方式尝试时,grepped的所有java进程都会在一行中分配给JAVA_PROCESSES变量。进程不会被新行分隔。因此,$ NUMBER_OF_JAVA_PROCESSES总是为我提供1。

$ NUMBER_OF_JAVA_PROCESSES显示1,由于$ JAVA_PROCESSES中的空行,甚至没有为JAVA_PROCESSES分配任何进程。

请建议一种分配由新行分隔的grepped进程的方法。

1 个答案:

答案 0 :(得分:1)

如果你想要的主要是知道你是否有任何东西,你可以测试变量是否为空:

java_procs=$(jps -vl | grep -v 'sun.tools.jps.Jps' | grep -v 'hudson.remoting.jnlp.Main' | grep -v grep)
if [ -z "$java_procs" ]; then
    echo "No processes"
fi

此外,我们可以通过使用扩展正则表达式简化grep,只需要一个进程:

java_procs=$(jps -vl | grep -Ev 'sun.tools.jps.Jps|hudson.remoting.jnlp.Main|grep')

假设jps输出的所有行都不能包含换行符,如果需要,我们可以在此之后得到计数:

num_procs=$(printf '%s\n' "$java_procs" | wc -l)

您遇到的主要问题是您没有引用您的变量,因此echo $JAVA_PROCESSES正在展开,然后受到分词的影响,因此您的换行符被“吃掉”#34 ;由壳。您始终只有一行,它是JAVA_PROCESSES变量中所有单词的空格分隔列表。为了防止分词,你可以引用变量,就像我在上面的代码中所做的那样。

echo也会在最后添加一个换行符,这有时很好,而且有时不太好,但你应该知道它发生了(这就是为什么你总会得到一个即使没有进程也算1。