Это - код до сих пор:
#! /bin/bash
index=0
dirs=()
dirs[0]=$(pwd)
size=${#dirs[*]}
dirJump=" "
select choice in quit back jump $(ls -d */); do
echo "###########################################################"
ls -l | egrep -v '^d' | sed -e '1 d'
if [[ $choice == "quit" ]]; then
break
else if [[ $choice == "back" ]]; then
size=${#dirs[*]}
if (( size > 1 )); then
unset dirs[$(( ${#dirs[*]}-1 ))]
cd ${dirs[$(( ${#dirs[*]}-1 ))]}
fi
else if [[ $choice == "jump" ]]; then
echo "Enter a directory to jump to: "
read dirJump
if (( ${#dirs[*]} == 10 )); then
unset dirs[0]
cd $dirJump
dirs[$(${#dirs[*]})]="$dirJump"
else
cd $dirJump
dirs[$(${#dirs[*]})]="$dirJump"
fi
else
echo "do other things"
fi
done
Когда я тестирую его, я получаю ошибку:
./dirNav.bash: line 35: syntax error near unexpected token `done'
./dirNav.bash: line 35: `done'
Я думал, что необходимо было поместить "сделанный" в конце выбора. Что я делаю неправильно?
Ваш if..fi
конструкция имеет неправильное ключевое слово.
нет никакого ключевого слова как else if
в bash
, это должно быть elif
. Таким образом, проблема - Вы, имеют два else if
ключевые слова в Вашем коде, meke их как:
if ....; then
## something
elif ....; then
## something
elif ....; then
## something
else
## something
fi
Ошибка не имеет никакого отношения к "сделанному" оператору; это - общий тип ошибки, указывающей, что интерпретатор добрался в конец, но не ожидал добираться там все же. Таким образом, это ожидало разделитель для предыдущего оператора, но добралось в конец, никогда не получая то, что это ожидало.
я действительно не думаю, что должен сказать Вам точную ошибку как нахождение, что ошибки являются важной частью обучения программировать. Действительно, у Вас должно теперь быть достаточно информации для нахождения его, но я буду давать еще одну подсказку и советовать Вам проверять все Ваш, если операторы для проверки они завершат правильно