整数表达式预期

时间:2015-11-05 10:39:29

标签: 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%%.*}
#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

提前致谢

2 个答案:

答案 0 :(得分:0)

空格在bash中很重要。

命令执行的语法是:

command arg1 arg2 ...

所以,

var = value  # command: var,  arg1: =,    arg2: value

此规则有两个例外

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

  • 指定一个变量(你想要这个):
    var=value

答案 1 :(得分:0)

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

shell脚本的一般语法是

[ variable=value ...] command parameters ...

会在value期间将variable分配给command,然后恢复其原始值。所以你正在运行的管道暂时将num2设置为空字符串(显然它已经包含了),然后运行管道而不将输出存储在任何地方(例如,我想象你期望的那样,在num2中)。

以下是您脚本的固定版本,其中包含Awk脚本处理您使用grep以及headwc的内容的其他更改。由于这些命令的功能很容易在Awk中被替换,因此使用外部实用程序是值得怀疑的(特别是对于grep而言,当您将其作为简单Awk脚本的预处理器运行时,它实际上是useless。 / p>

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

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