我的Bash脚本有什么错误? (第43行:在意外标记“elif”附近出现语法错误)

问题描述:

我在线上关注了Lynda.com课程。我的Bash脚本有什么错误? (第43行:在意外标记“elif”附近出现语法错误)

我正在努力学习所有我能做的事情,但我仍然在命令替换,数组和阵列中挣扎,并且有时会出现If循环。

#!/bin/bash 
MLOG="/var/log/mail.log" 
SLOG="/var/log/syslog" 

echo "Which log(s) do you want to see? " 

echo "[1] Head Of Mail.log?" 
echo "[2] Head Of Syslog?" 
echo "[3] Tail Of Mail.log?" 
echo "[4] Tail Of Syslog?" 
echo "[5] Dump Mail.log to File?" 
echo "[6] Dump Syslog to File?" 


read -p "Select an option [1-6]: " OPTION 

if 
test "$OPTION" -eq "1" 
then 

head $MLOG 

elif 
test "$OPTION" -eq "2" 
then 
head $SLOG 

elif 
test "$OPTION" -eq "3" 
tail $MLOG 

elif 
test "$OPTION" -eq "4" 
tail $SLOG 

elif 
test "$OPTION" -eq "5" 
cat "$MLOG" > ./MessageLogDump.txt 
echo "Message.Log Successfully Dumped in PWD" 

elif 
test "$OPTION" -eq "6" 
cat "$SLOG" > ./SysLog.txt 
echo "Syslog Successfully Dumped in PWD" 

else $? -ne "0" 
echo "Something went wrong somewhere" 

else z $OPTION 
echo "You selected an incorrect option" 
fi 

有错误我收到任何输出:即使只的标准输入“1”

./GenSysLog.sh: line 43: syntax error near unexpected token `elif' 
./GenSysLog.sh: line 43: `  elif' 

我试图寻找在这里的其他问题和答案有同样的错误,我注意到人们提到关于CR & LF,但我仍然无法弄清楚。

谢谢。

+0

如果你把它写成'elif test“$ OPTION”-eq 2;那么没有所有额外的换行符 - 读者(比如你)会更容易看出你错误地忽略了'then'。也就是说,这完全是一个使用case语句而不是if/elif/elif/...块的完美情形。 – 2014-10-04 19:59:56

+0

...顺便说一句,我建议测试你的错误处理代码 - 你可能会注意到它实际上并不工作,因为如果没有选择菜单选项,它只会测试'$?',所以如果你选择一个选项并且在其操作中涉及的某些内容失败,“$?'从不检查。 (另外,在代码中既不使用''''或'test',所以它会尝试运行'$?'的扩展作为命令,而不是测试它的值。 – 2014-10-04 20:06:33

请勿使用除环境变量和内置shell变量以外的大写变量名 - 这样做会增加命名空间冲突的风险。除此之外,请考虑case声明:

error() { echo "Something went wrong somewhere"; } 
trap error ERR 

read -p "Select an option [1-6]: " option 
case $option in 
    1) head "$MLOG" ;; 
    2) head "$SLOG" ;; 
    3) tail "$MLOG" ;; 
    4) tail "$SLOG" ;; 
    5) cat "$MLOG" > ./MessageLogDump.txt 
    echo "Message.Log Successfully Dumped in PWD" ;; 
    6) cat "$SLOG" > ./SysLog.txt 
    echo "Syslog Successfully Dumped in PWD";; 
    *) echo "You selected an incorrect option" ;; 
esac 

更短且易于阅读。