以下检查不起作用:
if [ $LEN = `expr $CNPROC + $CTotal` ])
并返回expr non-numeric argument shell script
。
总是它会转向别的。请告诉我这是什么错误。
早些时候我没有使用,所以当我把它放在while循环中时,同样的事情突然正常工作它不起作用。
#!/usr/bin/ksh
echo "`${BOLD}` ***** Checking Memory Utilization User*****`${UNBOLD}`"
echo "==================================================="
IFS='|'
cat configMachineDetails.txt | grep -v "^#" | while read MachineType UserName MachineName
do
export MEMORY_USAGE1=`ssh -f -T ${UserName}@${MachineName} prstat -t -s rss 1 2 | tr '%' ' '| awk '$5>5.0'`
export LEN=`echo "$MEMORY_USAGE1"|wc -l`
export CNPROC=`echo "$MEMORY_USAGE1"|grep "NPROC"|wc -l`
export CTotal=`echo "$MEMORY_USAGE1"|grep "Total"|wc -l`
if [ $LEN = `expr $CNPROC + $CTotal` ]
then
echo "`${BOLD}`**************All usages are normal !!!!!! *************`${UNBOLD}`"
else
echo "`${BOLD}`**** Memory(%) is more than 5% in MachineType $MachineType UserName $UserName
MachineName $MachineName *******`${UNBOLD}`"
echo "===================================================="
echo "$MEMORY_USAGE1"
fi
done
答案 0 :(得分:2)
在if
声明之前加上以下声明:
echo "[$MEMORY_USAGE1]"
echo "[$LEN]"
echo "[$CNPROC]"
echo "[$CTotal]"
看看会发生什么。令人惊讶的是,这个错误几乎总是引起:-),将非数字数据传递给expr
,而echo
语句应该告诉你究竟是什么问题。
例如:
pax> expr 1 + x
expr: non-numeric argument
根据您的评论输出:
[ NPROC USERNAME SWAP RSS MEMORY TIME CPU
Total: 143 processes, 2449 lwps, load averages: 1.76, 2.56, 2.94
NPROC USERNAME SWAP RSS MEMORY TIME CPU
Total: 148 processes, 2443 lwps, load averages: 1.82, 2.57, 2.95]
[ 4]
[ 2]
[ 2]
数值前面的空格可能会导致您的问题。尝试替换所有出现的:
|wc -l
使用:
|wc -l|sed 's/ //g'
删除wc
输出中的空格。
答案 1 :(得分:1)
为什么不使用ksh(也适用于Bash)内置算术运算和比较?
而不是:
if [ $LEN = `expr $CNPROC + $CTotal` ]
尝试:
if (( LEN == CNPROC + CTotal ))
它更宽容价值观中的空间。
答案 2 :(得分:1)
替换
if [ $LEN = `expr $CNPROC + $CTotal` ]
与
if [ $LEN = `expr $CNPROC+$CTotal` ]
(操作数之间没有空格)看看是否有帮助
答案 3 :(得分:1)
删除+周围的空格绝对是错误的答案。操作员需要一个空间作为分隔符,在某些情况下,例如乘法,也需要进行转义。