shell script中的syntax error near unexpected token `then' 问题

时间:2022-01-31 22:43:54

其实这是一个shell下判断符号 [ ] 加空格的问题,一定要小心

编写《鸟哥》给的示例程序时,运行时出现:syntax error near unexpected token `then'

[root@localhost scripts]# vi sh06-02.sh
[root@localhost scripts]# ./sh06-02.sh
Please input(Y/N): Y
./sh06-02.sh: line 8: syntax error near unexpected token `then'
./sh06-02.sh: line 8: `if[ "$yn" == "Y" ] || [ "$yn" == "y" ]; then'

打开脚本文件如下:

shell script中的syntax error near unexpected token `then' 问题

发现then和fi不匹配,红底白字高亮的意思就是此处可能有错?,

上网搜索,原来if和中括号[]之间也需要空格键隔开,修改后vim语法就不报错了,如下:

shell script中的syntax error near unexpected token `then' 问题


关于判断符号[ ],也就是中括号,下面引自鸟哥的解释:

除了我们很喜欢使用的 test 之外,其实,我们还可以利用判断符号『 [ ] 』(就是中括号啦) 来进行数据的判断呢!举例来说,如果我想要知道 $HOME 这个变量是否为空的,可以这样做:

[root@www ~]# [ -z "$HOME" ] ; echo $?

使用中括号必须要特别注意,因为中括号用在很多地方,包括万用字节与正规表示法等等,所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字节来分隔喔!假设我空白键使用『□』符号来表示,那么,在这些地方你都需要有空白键:

[  "$HOME"  ==  "$MAIL"  ]
[□"$HOME"□==□"$MAIL"□]
 ↑       ↑  ↑       ↑

其实if与[]之间也是需要空格键隔开的

上面的例子在说明,两个字串 $HOME 与 $MAIL 是否相同的意思,相当於 test $HOME = $MAIL 的意思啦!而如果没有空白分隔,例如 [$HOME==$MAIL] 时,我们的 bash 就会显示错误信息了!这可要很注意啊!所以说,你最好要注意:

  • 在中括号 [] 内的每个组件都需要有空白键来分隔;
  • 在中括号内的变量,最好都以双引号括号起来;
  • 在中括号内的常数,最好都以单或双引号括号起来。