代码示例:
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实例数
提前致谢
答案 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
以及head
和wc
的内容的其他更改。由于这些命令的功能很容易在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
重复的代码可以进一步重构以避免所有代码重复,但这会妨碍这个简单脚本的可读性,所以我没有这样做。