Синтаксическая ошибка Bash, когда “еще” следует за пустым “затем” пункт

gparted CD помогает переместить и изменить размер разделов и наиболее распространенных файловых систем (включая Linux ext2/3/4 и xfs и Windows NTFS).

Предложенная процедура должна клонировать старый SSD к новому (например, с dd), затем загрузитесь в gparted CD, переместите раздел Linux в конец диска, затем разверните раздел NTFS).

gparted может использоваться, чтобы сделать клонирование, а также изменение размеров.

Другой альтернативой является Clonezilla, который может также сделать клонирование дисков и изменение размеров раздела, но с интерфейсом меню текстового режима, а не GUI. IMO это более способно и featureful, чем gparted (и существует 64-разрядных версий, а также 32-разрядный, который полезен, если Вам нужно к chroot в 64-разрядный Linux rootfs для спасения/восстановлений), но может быть более твердо использовать.

Конечно, легче сделать клонирование дисков в Clonezilla, таким образом, можно хотеть использовать и - загружают CD Clonezilla для клонирования и затем загружаются в GParted для легкого изменения размеров GUI.

36
02.06.2014, 01:59
4 ответа

Не используйте подстановку команд на выходе найти . Здесь все можно сделать с помощью find :

find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null

С помощью нескольких реализаций find (включая FreeBSD find , откуда она пришла, и GNU find ), вы можете использовать -delete вместо -exec rm ... .

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что нет команды между , затем и else , а некоторые оболочки (начиная с оболочки Bourne, из которой взят этот синтаксис) требуют как минимум один (а комментарий не является командой). Обратите внимание, что это совершенно произвольно, и нет никаких причин, по которым эти оболочки будут делать это. yash и zsh не имеют этого ограничения (, если ложь; тогда еще echo x; fi и даже , если ложь; тогда еще fi ] отлично с ними работают).

Как говорили другие, вы можете использовать команду noop наподобие : (или ничего не делать; ничего не делать; сделано ) или изменить логику с помощью ! ключевое слово (доступно в оболочках POSIX,но не оболочку Борна (вы обнаружите, что использование : для этого было обычным в этой оболочке)). mksh и yash поддерживают , если ложно; then () else echo x; fi (я бы не стал на это полагаться, поскольку это может измениться в будущих версиях).

Другой подход заключается в следующем:

lsof... || {
  cmd1
  cmd2
}

хотя одно отличие заключается в общем статусе выхода, который будет таким же, как у lsof , если lsof завершится неудачно.

23
27.01.2020, 19:36

Другая альтернатива: переверните вашу логику.

if ! lsof "$filename" >/dev/null;then
    echo "deleting $filename"
    rm "$filename"
fi
26
27.01.2020, 19:36

Похоже, вы хотите выполнить запрет на выполнение операций , если файл открыт, поэтому вам следует добавить : , которая является пустой командой в bash :

if lsof "$filename" > /dev/null; then
  # file is open
  :
else
  printf 'deleting %s\n' "$filename"
  rm -- "$filename"
fi

Если вы не используете : , bash не сможет проанализировать ваш код и покажет ошибка типа bash: синтаксическая ошибка рядом с неожиданным токеном else .

92
27.01.2020, 19:36

TL; DR

Ни один из других ответов на самом деле не отвечает на ваш исходный вопрос о том, почему команда выдает синтаксическую ошибку. Это вызвано отсутствием команды между , затем и else .

Отсутствует команда

Ваш исходный код выглядит так:

if lsof "$filename" > /dev/null
then
  # file is open
else
  echo "deleting $filename"
  rm "$filename"
fi

Проблема в том, что у вас есть комментарий между , затем и else , но комментария нет рассматривается как команда. Короче говоря, вы можете переписать возникшую у вас проблему (с точки зрения структуры) следующим образом:

$ if true; then else echo; fi
bash: syntax error near unexpected token `else'

Исправьте свой синтаксис с помощью встроенной программы Борна

. Вы можете решить эту проблему, поместив фактические команды перед else , но комментарий сам по себе не годится. Раздел if-then не может быть пустым; если вам нужен заполнитель, вы можете использовать встроенное двоеточие . Например:

$ if true; then :; else echo; fi

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

17
27.01.2020, 19:36

Теги

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