这是迄今为止的代码:
#! /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'
我以为你必须在选择末尾加上“done”。我做错了什么?
答案1
您的if..fi
构造有错误的关键字。
没有像 这样的关键字else if
,bash
应该是elif
。因此,问题是else if
您的代码中有两个关键字,如下所示:
if ....; then
## something
elif ....; then
## something
elif ....; then
## something
else
## something
fi
答案2
该错误与“done”语句无关;这是一种常见的错误,表示解释器已到达末尾,但尚未到达那里。也就是说,它期望上一个语句的终止符,但却到达末尾而没有得到它所期望的东西。
我真的不认为我应该告诉你确切的错误,因为查找错误是学习编程的一个重要部分。实际上,你现在应该有足够的信息来找到它,但我再给你一个提示,并建议你检查所有的 if 语句,以确保它们正确终止