2017-02-11 5 views
0

Я хотел бы иметь скрипт bash, который проверяет, имеет ли файл больше # количества строк, но я еще не получил его правильно, и я не уверен о том, как это сделать. Я никогда раньше не использовал bash.bash: конвертировать строку в int & if int> #

прямо сейчас я использую: linesStr=$(cat log | wc -l), чтобы получить количество строк в файле (предположим, что это строка). когда эхо-сигнал дает мне число 30, которое является правильным.

но так как его, скорее всего, строка, она не делает if-statement, поэтому мне нужно, чтобы linesStr преобразовывался в int called linesInt.

У меня также есть чувство, что сам оператор if не выполнен правильно.

#!/bin/bash 

linesStr=$(cat log | wc -l) 
echo $linesStr 

if [$linesStr > 29] 
    then echo "log file is bigger than 29 lines" 
    #sed -i 1d log 
fi 

Я был бы признателен, если бы кто-нибудь мог дать мне простое решение для начинающих.

+0

Вы можете просто сделать 'туалет -l melpomene

+1

wc -l HuskerDoggo

+1

Извините, это была ошибка в моем исходном комментарии. 'wc -l log' печатает' 30 log', но 'wc -l melpomene

ответ

3
  1. Не нужно для cat.
  2. Отсутствие пробелов вокруг [ и ].
  3. Используйте оператор сравнения вместо оператора перенаправления.

Вот рабочий сценарий.

#!/bin/bash 

linesStr=$(wc -l < log) 

if [[ "$linesStr" -gt "29" ]]; then 
    echo Foo 
fi 
+3

Нет необходимости в 'awk'. – melpomene

+0

Попробуйте это. – merlin2011

+0

С вашим скриптом я получаю: -bash: test.bash: строка 15: синтаксическая ошибка около неожиданного токена 'fi ' -bash: test.bash: строка 15: 'fi ' – HuskerDoggo

1

Для преобразования не существует строковых или целочисленных типов. Проблема в том, что вы используете неправильный оператор сравнения. Для численного сравнения используйте if [ $linesStr -gt 29 ]. Прочтите man bash раздел CONDITIONAL EXPRESSIONS для доступных операторов.

+1

Другая проблема заключается в том, что '[' является командой (и ']' является аргументом этой команды), поэтому вам нужны пробелы вокруг '[' и ']'. '[$ linesStr' попытается запустить команду с именем' [30'. – melpomene

2

ваш, если блок кода неправильно if [$linesStr > 29] должен быть пробел после [ и перед ]

#!/bin/bash 

linesStr=$(wc -l < log) 
echo $linesStr 

if [[ $lineStr -gt 29 ]];then 
    echo "log file is bigger than 29 lines" 
fi 

рекомендуется всегда использовать [[ ]] с заявлением, если вместо использования [ ]. Всякий раз, когда вы хотите сравнить целые числа, не используйте > или <, используйте -gt-ge-lt-le. И если вы хотите сделать какую-либо форму математического сравнения, то желательно использовать (()).

((lineStr > 29)) && { 
    # do stuff 
} 

следует также отметить, что вам не нужны операторы сравнения баш или получения значения переменной с $ при использовании (())

+1

Сравнение чисел в bash (man bash - арифметическая оценка) может быть выполнено с помощью (()) для жестко закодированных чисел, но с переменными есть ошибка: если одна из переменных содержит недопустимый номер (то есть текст), результат арифметической оценки это неверно. Протестируйте его с помощью: 'a = 4; b =" 3 "; (($ a> $ b)) && echo" ok "|| echo "not ok" (это отлично работает), а затем повторите тест, назначив 'b =" asd "'. –

0
(($(wc -l < log) > 29)) && echo too long 
+0

Хотя это может теоретически ответить на вопрос, было бы [предпочтительнее включить основные части ответа] (http://meta.stackoverflow.com/q/8259) здесь и предоставить ссылку для справки. –

Смежные вопросы