ubuntu 下通过 sh 命令运行脚本产生如下错误:[: y: unexpected operator
今天同事在打包 deb 时发生了如下错误:
[: y: unexpected operator
脚本代码如下:
read -p " Make Release Version [y/n]:" Y
if [ $Y == 'y' ]
then#...
else#...
fi
同事运行脚本的命令为:
sh test.sh
如果直接运行脚本(“./test.sh”)则不会有这个问题。经过上网查资料,发现是因为脚本解释器不同造成的,整理如下:
ubuntu 中,脚本解释器从系统 6.10 开始默认改为了 dash,而使用 sh 命令执行该脚本就是使用 dash 来执行脚本的。在该解释器中,变量与字符串判断是否相同使用的是一个等号,这就造成了上述问题。解决版本就是使用如下命令:
bash ./test.sh
即:通过指明解释器软件。或者将两个等号改为一个等号亦可。
问题解决之后,搜索了下 sh 命令,原来其已经被软连接至 dash 了,如下:
sh -> dash
所以用 sh 执行脚本就是用 dash 执行脚本,所以会报错。 而直接运行脚本则默认使用了 bash,所以能够执行成功,原因是脚本开头写的代码:
#!/bin/bash
这句代码的含义就是告诉系统,该脚本默认执行的解释器为 bash 。
再扩展下,bash 解释器实际上是 Bourne Again shell,它是 Linux 操作系统缺省的 shell,是Bourne shell 的扩展,简称 Bash 。
Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用。
总结:
从时间轴上来说,shell 解释器发展历史如下:
Bourne shell
|(增加大量功能)
bash(Bourne Again shell),位置:/bin/bash,使用方法:#! /bin/bash
| (简化功能)
dash(Debian Almquist Shell),位置:/bin/sh,使用方法:#! /bin/sh
(SAW:Game Over!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
