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!)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部