@li0ard
JS Dev

Как решить проблему в Bash?

Есть код:
#!/bin/bash

if [ -s file.txt ]
then
echo "File is empty"
else
count=1
cat file.txt | while read line
do
echo "$line"
count=$(( $count + 1 ))
done
fi

Однако файл не пустой, но скрипт все равно сообщает, что файл пустой. Как решить?
  • Вопрос задан
  • 1951 просмотр
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
-s проверяет что файл существует и он НЕ пустой.
если хотите пользоваться test, то логика такая:

if [ -f file.txt ]; then
  if [ -s file.txt ]; then
    echo "file.txt is not empty
  else
    echo "file.txt is empty"
  fi
else
  echo "file.txt doesn't exists"
fi


Можно еще так
if [[ $(stat -c "%s" file.txt) -eq 0 ]]; then
  echo "file.txt is empty"
else
  echo "file.txt doesn't exist or not empty"
fi
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
if [ -s file.txt ]
then
echo "File is empty"

Неправильный тест:
-s FILE
              FILE exists and has a size greater than zero


Правильный тест на файл нулевого размера наверно будет выглядеть так:
if [ -f file.txt -a ! -s file.txt ]

Но тогда и дальнейшая логика в else посыплется, потому что ветка else будет теперь означать "нет файла, не обычный файл, или файл ненулевого размера".
Ответ написан
castomi
@castomi
Серверный администратор - tickets.settin.ru
Вам в первом ответе привели из доков цитату. В ней написано файл существует и имеет размер больше нуля, так что при выполнении условия он никак не может быть пустым), пустой он в else.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы