我需要将命令的输出分配给变量。我试过的命令是:
#!/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进程的方法。
答案 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。