Подтвердить что ты не робот

Синтаксическая ошибка около неожиданного токена 'fi'

Я пытаюсь написать script, который удаляет все .jpg, которые заканчиваются нечетным числом. Это мой код:

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if[$((fname %  2)) -eq 1 ] then
    echo "removing $fname\n"
    rm $f
  fi
done

Когда я запускаю его, он выводит начало, а затем говорит "синтаксическая ошибка около неожиданного токена" fi '"

Когда я был на линии после того, как он сказал "синтаксическая ошибка возле неожиданного токена", тогда "

Как это исправить?

4b9b3361

Ответ 1

Помимо наличия then в новой строке, вам также потребуется пробел до и после [, который является специальным символом в BASH.

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if [ $((fname %  2)) -eq 1 ]
  then
    echo "removing $fname\n"
    rm "$f"
  fi
done

Ответ 2

Используйте Notepad ++ и используйте параметр "Преобразовать файл в формат UNIX". Это должно решить эту проблему.

Ответ 3

"Тогда" - это команда в bash, поэтому ей нужно ";" или новой строки перед ним.

#!/bin/bash
echo "start\n"
for f in *.jpg
do
  fname=$(basename "$f")
  echo "fname is $fname\n"
  fname="${filename%.*}"
  echo "fname is $fname\n"
  if [$[fname%2] -eq 1 ]
  then
    echo "removing $fname\n"
    rm $f
  fi
done

Ответ 4

Первая проблема с вашим script заключается в том, что вы должны поместить пробел после [.
Введите type [, чтобы увидеть, что на самом деле происходит. Он должен сказать вам, что [ является псевдонимом для команды test, поэтому [ ] в bash не является особым синтаксисом для условных выражений, это просто команда сама по себе. В bash вам следует выбрать [[ ]]. Эта общая ошибка сильно объясняется здесь здесь и здесь.

Другая проблема заключается в том, что вы не процитировали "$f", которая может стать проблемой позже. Это объясняется здесь

Вы можете использовать арифметические выражения в if, поэтому в некоторых случаях вам вообще не нужно использовать [ ] или [[ ]]. Подробнее здесь

Также нет необходимости использовать \n в каждом echo, потому что echo помещает новые строки по умолчанию. Если вы хотите показать две строки новой строки, используйте echo -e 'start\n' или echo $'start\n'. Этот синтаксис $'' объясняется здесь

Чтобы сделать его полностью идеальным, вы должны поместить -- перед произвольными именами файлов, иначе rm может рассматривать его как параметр, если имя файла начинается с тире. Это объясняется здесь.

Итак, вот ваш script:

#!/bin/bash
echo "start"
for f in *.jpg
do
    fname="${f##*/}"
    echo "fname is $fname"
    if (( fname % 2 == 1 )); then
        echo "removing $fname"
        rm -- "$f"
    fi
done