繁体   English   中英

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

[英]Assign a output of jps -vl command to a variable in shell script

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

 #!/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。

由于 $JAVA_PROCESSES 中的空行,即使没有进程分配给 JAVA_PROCESSES,$NUMBER_OF_JAVA_PROCESSES 也会显示 1。

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

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

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被扩展然后受到分词,所以你的换行符被外壳“吃掉”。 您总是只有一行,它是JAVA_PROCESSES变量中所有单词的空格分隔列表。 为了防止分词,您可以引用变量,就像我在上面的代码中所做的那样。

echo也总是会在最后添加一个换行符,这有时很好,有时不太好,但您应该意识到它正在发生(这就是为什么即使没有进程,您也总是会得到 1 的计数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM