expr сценарий оболочки с нечисловым аргументом - PullRequest
1 голос
/ 03 мая 2010

Проверка ниже не работает:

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

и возвращает expr non-numeric argument shell script.

Всегда будет иначе. Пожалуйста, скажите мне, в чем ошибка.

Раньше я не использовал while, поэтому то же самое работало нормально, теперь внезапно, когда я поместил его в цикл 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 ]

2 голосов
/ 03 мая 2010

Поставьте следующие операторы перед вашим 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 голос
/ 07 января 2018

Удаление пробелов вокруг + - абсолютно неправильный ответ. Оператору требуется пространство вокруг него в качестве разделителя, а в некоторых случаях, например, умножение, также необходимо экранировать.

1 голос
/ 01 июня 2012

Заменить

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

с

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

(без пробела между операндами) посмотрите, поможет ли это

1 голос
/ 03 мая 2010

Почему бы вам не использовать встроенные арифметические операции и сравнения ksh (также работает в Bash)?

Вместо:

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

Попробуйте:

if (( LEN == CNPROC + CTotal ))

Гораздо проще простить пробелы в значениях.

...