Синтаксическая ошибка около неожиданного токена '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 '"
Когда я был на линии после того, как он сказал "синтаксическая ошибка возле неожиданного токена", тогда "
Как это исправить?
Ответы
Ответ 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