什么是错误的"意外标记'fi'附近的语法错误"?



我无法处理这个问题。我运行脚本(我将在下面附上它(,在第一个问题之后,我得到了错误";第37行意外标记"fi"附近出现语法错误如果移除fi,则不会有任何变化。帮助我理解。。。我尝试了许多解决方案和dos2unix配置,并仔细检查了所有的缩进

#!/bin/bash
function pause (){
read -p "Press any key to continue ... "
}
timedatectl set-timezone Atlantic/Reykjavik
a=`date +"%Y-%m-%d %H:%M:%S"`
echo -n -e "Current Date/Time is    " 
date
sleep 2
read -p "is it correct (Yes/No) ? " CC
if [ "$CC" == "N" -o "$CC" == "n" ];then 
echo "Exit testing ..."
exit
fi 
else
read -p "Do you want to change (Yes/No) ? " CC
if [ "$CC" == "Y" -o "$CC" == "y" ];then
read -p "Please input new date, format: YYYYMMDD  " D
NEWD="`echo $D | cut -b 1-4`"-"`echo $D | cut -b 5-6`"-"`echo $D | cut -b 7-8`"    
read -p "Please input new time, format: HHMM   " T
NEWT="`echo $T | cut -b 1-2`":"`echo $T | cut -b 3-4`":"00"    
echo -n "date -s '" > d.sh
echo -n "$NEWD $NEWT" >> d.sh
echo "'" >> d.sh
chmod 777 d.sh
./d.sh
echo
sleep 1
clock -w
sleep 1
a=`date +"%Y-%m-%d %H:%M:%S"`
echo -n -e "NEW Date/Time is""e[0;32m $ae[0m"", "
read -p "Press ENTER to continue..."
fi

UPD:在此处输入图像描述删除后显示";否则";

UPD2这是第二个出现相同错误的类似代码。另外,不要求输入信息("请输入第一个MAC地址:(

在此处输入图像描述

echo "************************"
echo "  Serial number setting "
echo "************************"
SLEN=0
while [ "$SLEN" != "13" ]
do 
read -p "Please input Serial Number:" sn
SLEN="${#sn}"
done
echo "*************************"
echo "   MAC-address setting   "
echo "*************************"
PLEN=0
until [ "$PLEN" == "12" ] && [ "$VID" == "0015B2" ]
do 
read -p "Please input the First MAC address: " MACIN
PLEN="${#MACIN}"
if [ $PLEN != 12 ];then 
echo
echo MAC address LENTH error !!
fi
MAC=`echo $MACIN | tr a-z A-Z`
VID=`echo $MAC | cut -b 1-6`
if [ "$VID" != "0015B2" ];then
echo
echo -n "The first 6 digit MUST be"
echo -n -e "e[0;37;42m 0015B2 e[0m", but you input 
echo -e "e[0;37;41m $VID e[0m""!!" 
fi
done

对问题最可能的解释是脚本中的"外来"(非ASCII(Unicode字符。与大多数脚本和编程语言一样,Bash无法忍受令牌内或令牌旁边存在非ASCII字符。

例如,在这个语句中,then后面有一个空格:

if [ "$CC" == "N" -o "$CC" == "n" ];then 

这很好,只要该空格是ASCII空格字符(U+0020(。如果该空间字符恰好是非中断空间(U+00A0(,然后你会得到确切地你目睹的错误:

Current Date/Time is    Thu Jul 21 16:39:09 WEDT 2022
is it correct (Yes/No) ? y
./test.sh: line 14: syntax error near unexpected token `fi'
./test.sh: line 14: `  fi '

这只是一个例子。还有更多的Unicode字符会导致此问题。

  • 标记旁边甚至内的零宽度空间(U+200B(。顾名思义,这个字符在大多数字体中是不可见的
  • 非ASCII字母;我记得一个类似的问题,由西里尔字母Es代替了标识符中的罗马字母C。在许多字体中,两者无法区分

我强烈建议您使用十六进制查看器,并非常仔细地检查您的脚本是否存在Unicode字符。

删除"否则";在第一个if块之后,您的代码应该可以使用

最新更新