Відповіді:
Я думаю, що file.sh є з термінаторами рядків CRLF.
бігати
dos2unix file.sh
тоді проблема буде виправлена.
Ви можете встановити dos2unix в ubuntu за допомогою цього:
sudo apt-get install dos2unix
Інша річ, яку слід перевірити (що мені трапилося):
Тобто цей невинний на вигляд фрагмент спричинить ту саму помилку:
die () { test -n "$@" && echo "$@"; exit 1 }
Щоб зробити німого парсер щасливим:
die () { test -n "$@" && echo "$@"; exit 1; }
;
передбачається, що закінчення Every закінчується ;
таким чином, що наприкінці, наприклад: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
видасть цю помилку, тоді як if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
не буде ... помічати маленькі крапки з комою в кінці, тобто: після .bash
і fi
.
zsh
. Перший працює zsh
в sh
ні, ні в ні bash
. Якби я був 4 людьми, щоб я міг дати ці 4 голоси проти
Я також щойно отримав це повідомлення про помилку, використовуючи неправильний синтаксис у if
реченні
else if
(синтаксична помилка: несподіваний кінець файлу) elif
(правильний синтаксис)я налагодив його, коментуючи біти, поки це не спрацювало
пропозиція un-closed if => fi також підніме це
порада: використовуйте trap для налагодження, якщо ваш сценарій величезний ...
напр
set -x
trap read debug
unexpected end of file
помилка буде виникати, як тільки fi
буде потрапляти.
Я отримав цю відповідь із подібної проблеми на StackOverflow
Відкрийте файл у Vim і спробуйте
:set fileformat=unix
Перетворіть закінчення рядка eh на закінчення unix і перевірте, чи вирішує це проблему. Якщо редагуєте у Vim, введіть команду: set fileformat = unix та збережіть файл. Декілька інших редакторів мають можливість перетворювати закінчення рядків, наприклад Notepad ++ або Atom
Дякую @lemongrassnginger
dos2unix
як радить прийнята відповідь.
Тож я знайшов цю публікацію, і відповіді мені не допомогли, але я зміг зрозуміти, чому вона дала мені помилку. я маю
cat > temp.txt < EOF
some content
EOF
Проблема полягала в тому, що я скопіював вищезазначений код, щоб він був функцією, і ненавмисно вклав код у вкладку. Потрібно переконатися, що останній EOF не має вкладки.
EOF
відступив чотирма пробілами, і Баш не проаналізував його через це. Видалення пробілів вирішило проблему.
Це відбувалося для мене, коли я намагався викликати функцію за допомогою парен, наприклад
run() {
echo hello
}
run()
має бути:
run() {
echo hello
}
run
ДЛЯ ВІКН:
У моєму випадку я працював в ОС Windows і отримав ту саму помилку під час запуску autoconf.
Потім я перетворив Файл із перетворенням EOL у Windows (CR LF) наступним чином:
РЕДАГУВАТИ -> КОНВЕРСІЯ EOL -> ВІКНА (CR LF)
Я зміг вирізати та вставити ваш код у файл, і він працював правильно. Якщо ви виконуєте його таким чином, він повинен працювати:
Ваш файл "file.sh":
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Команда:
$ ./file.sh arg1 arg2 arg3
Зверніть увагу, що "file.sh" повинен бути виконуваним:
$ chmod +x file.sh
Можливо, ви отримуєте цю помилку b / c того, як ви робите введення (без труби, моркви тощо). Ви також можете спробувати розділити умову на дві частини:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Або, оскільки ви використовуєте bash
, ви можете використовувати вбудований синтаксис:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
І, нарешті, ви можете, звичайно, просто перевірити, чи були вказані 3 аргументи (чистий, підтримує сумісність оболонки POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Я просто вирізав і вставив ваш приклад у файл; це чудово бігло під Баш. Я не бачу з цим жодних проблем.
Для гарного заходу ви можете переконатись, що він закінчується новою лінією, хоча bash не повинен хвилювати. (Він працює для мене як з кінцевим новим рядком, так і без нього.)
Іноді ви побачите дивні помилки, якщо випадково вбудували керуючий символ у файл. Оскільки це короткий сценарій, спробуйте створити новий сценарій, вставивши його зі свого запитання тут, на StackOverflow, або просто повторно набравши його.
Яку версію bash ви використовуєте? ( bash --version
)
Удачі!
Переконайтесь, що ім’я каталогу, у якому знаходиться файл .sh, не має пробілу. наприклад: Скажімо, якщо вона знаходиться в папці під назвою 'Нова папка', ви обов'язково зіткнетеся з помилкою, яку ви цитували. Натомість просто назвіть його як 'New_Folder'. Я сподіваюся, що це допомагає.
Я знаю, що запізнився на вечірку. Сподіваюся, це може комусь допомогти.
Перевірте файл .bashrc. Можливо, перейменуйте його або перемістіть.
Обговорення тут: Неможливо отримати простий скрипт bash
У моєму випадку є надлишок приблизно \
такого:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
В кінці НЕ є \
аDATA.PATH_PREFIX ./afs/kinetics400