expr非数字参数shell脚本

时间:2010-05-03 11:53:47

标签: unix scripting ksh

以下检查不起作用:

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

4 个答案:

答案 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)

删除+周围的空格绝对是错误的答案。操作员需要一个空间作为分隔符,在某些情况下,例如乘法,也需要进行转义。