Shell 需要整数表达式

Shell 需要整数表达式,shell,unix,Shell,Unix,代码示例: declare -i a=1 echo "The number of NMON instances running in Performance VM" ps -ef | grep nmon | awk '{ print $2 }' | wc -l echo "---------------------------------------------" num2= ps -ef | grep nmon | awk '{ print $2 }' | wc -l #num1=${num2

代码示例:

declare -i a=1
echo "The number of NMON instances running in Performance VM"
ps -ef | grep nmon | awk '{ print $2 }' | wc -l
echo "---------------------------------------------"
num2= ps -ef | grep nmon | awk '{ print $2 }' | wc -l
#num1=${num2%%.*}
#num2 = $(ps -ef | grep nmon | awk '{ print $2 }' | wc -l)
echo "---------------------------------------------"
echo "${num2}"
while [ "$a" -lt "$num2" ]
do
kill -USR2 $(ps -ef | grep nmon | awk '{ print $2 }' | head -1)
a=`expr $a + 1`
done
在输出中,我得到以下错误 [::应为整数表达式

在调试中,它显示 ++“['1-lt']”

num2为空,但当我回显num2值时,我得到的值是正确的

输出:

在Performance VM中运行的NMON实例数

1. 1.
提前感谢

在bash中,空格很重要

命令执行的语法为:

command arg1 arg2 ...
所以

这条规则有两个例外

  • 将变量导出到已执行的命令(命令完成后变量消失):
    var1=value1 var2=value2..命令arg1 arg2…

  • 分配变量(您需要此变量):
    var=value


您在输出中看到的1不是来自
echo“${num2}”
。就像诊断已经告诉您的那样,此变量为空

shell脚本的一般语法是

[ variable=value ...] command parameters ...
它将在
命令
期间将
分配给
变量
,然后恢复其原始值。因此,您正在运行的管道临时将
num2
设置为空字符串(显然它已经包含),然后运行管道而不将输出存储在任何位置(例如,我想您预期的,
num2

这里是您的脚本的固定版本,还有一个附加更改,即Awk脚本处理您使用的
grep
head
wc
的内容。由于这些命令的功能在Awk中很容易被替换,因此使用外部实用程序是值得怀疑的(尤其是对于
grep
,当您只是将它作为一个简单的Awk脚本的预处理器运行时)


重复的代码可以进一步重构以避免所有代码重复,但这会在某种程度上妨碍这个简单脚本的可读性,所以我没有这样做。

num2=ps-ef | grep nmon | awk'{print$2}wc-l
应该是
num2=$(ps-ef | awk'/nmon/{print$2}wc l)
“…但当我回显num2值时,我得到的值是正确的。"不,你没有。投票结束。如果你不听好的建议,我们也帮不了你。
num2=
这是无效的语法。从技术上讲,这是有效的,但我确信你没有一个名为
num2=
@KarolyHorvath的应用程序。它完全有效,只是没有达到OP的预期。它为变量
num2
分配了一个空字符串对于管道的持续时间。只是好奇,异常在什么方面是“异常”?即使在这些情况下,空白似乎也很重要。
[ variable=value ...] command parameters ...
countnmon () {
    ps -ef | awk '/[n]mon/ { ++n } END { print n }'
}
declare -i a=1
echo "The number of NMON instances running in Performance VM"
countnmon
echo "---------------------------------------------"
num2=$(countnmon)
#num1=${num2%%.*}
#num2 = $(countnmon)
echo "---------------------------------------------"
echo "${num2}"
while [ "$a" -lt "$num2" ]
do
  kill -USR2 $(ps -ef | awk '/[n]mon/ { print $2; exit }')
  a=`expr $a + 1`
done