Bash 语法错误:意外出现文件结尾(应为“fi”),但fi已经存在

Bash 语法错误:意外出现文件结尾(应为“fi”),但fi已经存在,bash,Bash,每当我尝试运行这个bash时,它都会给我一个语法错误,即结尾是意外的,它希望最后一行有一个“fi”,并且它已经在那里了。我对bash还相当陌生,但我知道足够多的知识来做基本的事情。有人知道我做错了什么吗 #!/bin/sh echo "============================================================================================" echo "||What is the Songs Genre (Class

每当我尝试运行这个bash时,它都会给我一个语法错误,即结尾是意外的,它希望最后一行有一个“fi”,并且它已经在那里了。我对bash还相当陌生,但我知道足够多的知识来做基本的事情。有人知道我做错了什么吗

#!/bin/sh
echo "============================================================================================"
echo "||What is the Songs Genre (Classical, Country, Disco, Dubstep, Pop, Rap, Rock, or Techno)?||"
echo "============================================================================================"

read "Genre"

if ( $genre=="Classical")
then 
cd ~/Music/Classical

if ( $genre=="Country") 
then
cd ~/Music/Country

if ( $genre=="Disco") 
then
cd ~/Music/Disco

if ( $genre=="Dubstep")
then 
cd ~/Music/Dubstep

if ( $genre=="Pop") 
then
cd ~/Music/Pop

if ( $genre=="Rap")
then 
cd ~/Music/Rap

if ( $genre=="Rock")
then 
cd ~/Music/Rock

if ( $genre=="Techno")
then 
cd ~/Music/Techno

fi

echo "============================"
echo "||Paste Youtube link here.||"
echo "============================"

read "Link"
sudo youtube-dl -x --audio-format mp3 $Link

echo "========================"
echo "||Any More songs?(Y/N)||"
echo "========================"

read "Loop"

if $Loop==Y
then
cd
sh youtube.sh & exit

else
exit
fi

您需要将
fi
放在每个
if…then
块之后,或者将第一个
if
语句之后的
if
语句更改为
elif
,这样可以更加简洁。我会这样写:

#/bin/bash
回声“=========================================================================================================================================================================================================================================================================================================
#将流派名称放入数组中
流派=(古典乡村迪斯科Dubstep流行说唱摇滚技术)
#使用'select'而不是级联if语句
PS3=“选择一种类型:”
在“${genres[@]}”中选择选项;做
#检查选项是否在数组中的复杂条件
如果[[“${genres[*]}”==*“$choice”*]];然后
打破
fi
完成
阅读-p“输入Youtube链接:”链接
mkdir-p~/Music/“$choice”#确保目录存在
cd~/音乐/“$choice”
youtube dl-x——音频格式mp3“$link”#你真的需要sudo吗?
再次读取-p“(是/否)”
如果[[$REACH==[yY]*];然后
exec“$0”#在不硬编码程序名称的情况下重新启动
fi

你认为你可以不把它放在其他人身上而逃脱吗?我相信你想用
elif
来解决所有问题,但如果第一个问题没有解决,那就是你的朋友。运行代码,修复发现的内容,然后返回这里。(例如,
($genre==“Pop”)
根本不是有效的比较)。所有这些
if
语句可能都应该是
case
语句。每个
if
需要一个
fi
。。。你有很多永远不会关闭的if。这是必要的,但不足以让OP的代码真正工作<例如,代码>如果($genre==“Techno”)永远不会做OP期望它做的事情。(这就是为什么指定一个人应该“回答好的问题”的部分原因;如果问题局限于一个问题,而不是发布一个包含一大堆问题的脚本,那么问题就不那么严重了)。该问题专门询问语法错误。我回答了那个语法问题。如果代码中还有其他错误,那就这样吧,但问题非常直接,它问的是什么,这使它成为一个问得很好的问题。如果问题是这段代码出了什么问题,那么我同意你的看法,但事实并非如此。如果它包含一个完整的脚本(还有一堆其他的bug),那么问题就不太清楚了而不是使用最短的代码,让其他人只能在手边的语法错误上重现。如果他们知道如何在这里产生语法错误,那么他们不必知道如何修复语法错误吗?你不需要事先知道问题的直接原因,就可以迭代地解决问题,直到它消失,然后备份一个错误步帮助中心MCVE页面(我之前链接到该页面)和讨论方法。(事实上,遵循这一过程通常会产生一个根本不需要问的问题)。