2010-05-03 105 views
1

以下檢查不工作:EXPR非數字的參數shell腳本

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

無用的'cat':'grep -v「^#」configMachineDetails.txt |而...'。另外,您不太可能需要導出任何這些變量。 – 2010-05-03 12:57:41

+0

我喜歡改變解釋decl來添加'-x'和/或'-v'選項:'#!/ usr/bin/ksh -xv'。這會打印很多東西,但它可以幫助我追蹤shell正在做的替換。嘗試一下,然後用相關線路上的輸出線更新你的問題。 – 2010-05-03 13:03:08

+0

另外,請注意,雖然ksh將使用管道進入'while'並將變量保留爲其新值,但其他shell(如Bash)會創建一個子shell,並且新值將丟失。在Bash中,'a = 1;回聲「嗨」|同時閱讀b;做echo $ b; A = 2;完成; echo $ a'打印「hi」和「1」。這將產生預期的「2」:'a = 1;同時閱讀b;做echo $ b; A = 2;完成<<回聲「嗨」);回聲$ A' – 2010-05-03 13:05:15

回答

2

把下面的語句您if語句之前:

echo "[$MEMORY_USAGE1]" 
echo "[$LEN]" 
echo "[$CNPROC]" 
echo "[$CTotal]" 

,看看什麼出來。這個錯誤幾乎總是引起的,令人驚訝的足夠:-),通過傳遞非數字數據到exprecho聲明應該告訴你到底是什麼問題。

例如:

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輸出擺脫空間。

+0

隨着我是否應該如果[$ LEN ='EXPR $ CNPROC + $ CTotal'] 或 如果[$ LEN -eq'EXPR $ CNPROC + $ CTotal']使用 值是 [ NPROC USERNAME SWAP RSS MEMORY TIME CPU 總計:143個進程,2449 lwps,負載平均值:1.76,2.56,2.94 NPROC USERNAME SWAP RSS MEMORY TIME CPU 總計:148個進程,2443個lwps,負載平均值:1.82,2.57,2.95] [4] [2] [2] 這些值在詢問順序中給出。 – Kimi 2010-05-03 12:42:16

+0

@Kimi:這是引起問題的值中的空格:'expr「2」+「2」' - >「expr:非數字參數」,「expr」2「+」2「' - >」 4「 – 2010-05-03 12:52:00

+0

在這種情況下它應該沒有關係 - 我測試了它們,它們在數字上運行得很好。技術上'-eq'是數字,'='是字符串。但是我注意到變量中有空格,所以你可能想在'wc -l'位後面加上'| sed's/// g''(從wc'輸出中刪除空格)。 – paxdiablo 2010-05-03 12:53:48

1

爲什麼不使用ksh(也適用於Bash)內置的算術運算和比較?

相反的:

if [ $LEN = `expr $CNPROC + $CTotal` ] 

嘗試:

這是多大的價值空間更寬容。

1

更換

if [ $LEN = `expr $CNPROC + $CTotal` ] 

if [ $LEN = `expr $CNPROC+$CTotal` ] 

(操作數之間沒有空格),看看是否有幫助

1

刪除空格周圍+絕對是一個錯誤的答案。操作員需要一個空格作爲分隔符,在某些情況下,例如乘法,也需要轉義。