2017-02-21 43 views
0

Я читал много тем справки здесь, но так и не нашел ответа по моему конкретному вопросу или проблеме.простой математический расчет в сценарии bash

У меня есть этот Баш код в красной шляпе 7 (не то, что это важно, но ..)

if [[ $(stat -c %s) -gt 1024 ]]; 
    then 
    echo "   $(scale=1;stat -c %s log.txt/1024) KiloBytes" 
    else 
    echo "   $(stat -c %s log.txt) Bytes" 
    fi 

и выдает эту ошибку:

stat: missing operand Try 'stat --help' for more information. 0 Bytes

С этой крошечной проверки я хочу чтобы увидеть, превышает ли файл log.txt 1024 байта, если он равен true, делит общий размер байта на 1024 и эхо выводит как XXXX KiloBytes. Но чего мне не хватает. Shellcheck.com говорит, что все в порядке ...

Может ли кто-нибудь помочь мне в этом вопросе?

+0

Что вы пытаетесь «статизировать»? Вы не говорите, что ничего не ставите, поэтому он жалуется на это. Возможно, вы имели в виду '$ (stat -c% s log.txt)'? –

+0

Да, я имел в виду '$ (stat -c% s log.txt)' спасибо – floppy

+0

Кстати, вместо того, чтобы выполнять 'stat' снова, вы, вероятно, просто хотите сохранить результат в переменной, а затем проверить и напечатать значение этой переменной. –

ответ

1

Вам не хватает имени файла. Вы, вероятно, хотите получить

if [[ $(stat -c %s log.txt) -gt 1024 ]]; 
#   look: ^^^^^^^ 

быть вашей первой линией. Если вы делаете в соответствии с инструкциями и введите stat --help, он покажет вам, что правильное использование является

Usage: stat [OPTION]... FILE... 
Display file or file system status. 

-c %s является OPTIONS, и вы не имеете любой файл, указанный в первой строке.

+0

Я не могу поверить, что я наблюдал за этим, им жаль. Благодарим вас за руководство и помощь. он исправлен. – floppy

0

Возможно, вам недостает вызова bc, который является программой, используемой для арифметики с плавающей запятой. scale=1 обычно является частью входа в bc:

# No 
echo "   $(scale=1;stat -c %s log.txt/1024) KiloBytes" 
# Yes - broken down into steps for easy reading 
size=$(stat -c %s log.txt) 
result=$(echo "scale=1; $size/1024" | bc) 
echo "   $result KiloBytes" 
0

Возможно, вы были бы заинтересованы в вырубке размера вашего скрипта:

stat -c %s log.txt | awk '{ print ($0 > 1024 ? $0/1024 " Kilobytes" : $0 " bytes") }' 

Разбирает выход stat с использованием AWK и печати либо байт или Kilobytes, в зависимости от размера.