2015-12-09 8 views
0

Я попытался изменить немного сценария проверки использования дискового пространства, и я столкнулся ошибка ниже:Ошибка на сценариях использования дискового пространства

disk_space.sh: line 32: [: Use: integer expression expected

# Set alert limit, 90% we remove % for comparison 
alert=90 

# $1 is the partition name 
# $5 is the used percentage 
# Print the df -h, then loop and read the result 
df -h | awk '{ print $1 " " $5 }' | while read output; 
do 

#echo $output 

# Get partition name 
partition=$(echo $output | awk '{ print $1 }') 
#echo 'Partition: ' $partition 

# Used space with percentage 
useSpPer=$(echo $output | awk '{ print $2}') 
#echo 'Used space %: ' $useSpPer 

#used space (remove percentage) 
useSp=$(echo -n $useSpPer | head -c -1) 
#echo 'Used space digit: ' $useSp 

# Recap 
#echo $useSp ' has ' $partition 

# -ge is greatter than or equal 
if [ $useSp -ge $alert ]; then # THIS LINE 32 
echo $partition 'is running out of space with '$useSpPer 

#else 
#echo 'Down' 

fi 
done 

Если кто-то имеет представление о том, оценил это и благодаря заблаговременно

ответ

1

Вставка set -x в верхней части вашего скрипта, чтобы он перекликался с каждой строкой перед выполнением, является отличным способом отладки сценариев оболочки - вы почти наверняка найдете, что одна из этих переменных (используется в команде [) isn как вы ожидали.

Это хороший общий совет, но, к этой проблеме, где вы локализованной проблемы, это, вероятно, достаточно хорошо (и, конечно, менее многословным), чтобы поместить эту строку перед строкой генерации проблемы:

echo "DEBUG [$useSp]" 

Если вы это сделаете, вы обнаружите, что значение, которое вы проверяете, вовсе не является числовым значением. Это потому, что выход df -h выглядит примерно так:

Filesystem Size Used Avail Use% Mounted on 
/dev/sda1 48G 4.9G 40G 11%/
/dev/sr0  71m 71M  0 100% /media/cdrom0 

Это означает, что для первой линии, вы будете сравнивать слово Use против своего предела и [ не будет обрабатывать, что хорошо:

pax> if [ 20 -gt 10 ]; then echo yes; fi 
yes 
pax> if [ Use -gt 10 ]; then echo yes; fi 
bash: [: Use: integer expression expected 

Исправление довольно простое. Поскольку вы не хотите ничего делать с первой линии, вы можете просто использовать ваши существующиеawk чтобы отфильтровать его:

df -h | awk 'NR>1{print $1" "$5}' | while read output; 
do 
    ... 

NR>1 обрабатывает только номера записей два и так далее, пропуская первый ,

+0

это результат: ОТЛАДКА [использование] [90] disk_space.sh: строка 33: [: Использование: целое выражение ожидается ОТЛАДКА [78] [90] ОТЛАДКА [78] [90] ОТЛАДКА [ 1] [90] DEBUG [2] [90] DEBUG [0] [90] DEBUG [0] [90] DEBUG [99] [90] /DEV/sda2 бежит из космоса с 99% как я могу удалить строку, в которой строка USE –

1

Ваше значение useSp является «Использовать» [нечисловой], поэтому -ge пытается сравнить строку с целым числом [и жаловаться].


UPDATE:

По Вашему запросу, есть несколько способов исправить сценарий.

Исправление существующего скрипта - одно [см. Исправление ниже]. Но этот тип манипуляций с строками в bash может быть немного рискованным, как вы узнаете.

Другой, так как вы уже используете awk [в нескольких местах], перекодировать сценарий, чтобы сделать большую часть работы в awkсценария файл. Например:

df -h | awk -f myawkscript.awk 

Но, AWK немного древнее, так что, в конечном счете, новый язык, такие как perl или python бы путь в долгосрочной перспективе. Мощные манипуляции и вычисления строк. Они скомпилированы для виртуальных машин, поэтому они работают быстрее. И у них отличные диагностические сообщения.ИМО, а не узнать больше awk, начать обучение perl/python [а, профессионально, есть спрос на программирование на этих языках]

Но для немедленного исправления в существующий сценарий:
OLD: df -h | awk '{ print $1 " " $5 }' | while read output;
NEW: df -h | tail -n +2 | awk '{ print $1 " " $5 }' | while read output;

+0

Как я могу игнорировать первую строку результата –