红联Linux门户
Linux帮助

shell脚本第一行:#!/bin/bash的含义

发布时间:2017-04-05 09:53:18来源:linux网站作者:IOT_Lusian
相信有接触过shell脚本的同学们都应该知道,shell脚本的第一行一般会写有以下字样:
#!/bin/bash
或者
#!/bin/sh
或者
#!/bin/awk
 
比较常见的说法是:第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。
但我们也知道,在shell脚本里符号#是作为注释符出现的,在其之后的同一行内容会被视为注释进而不执行。
那么第一行所谓的指定路径的语句真的会生效吗?或者换个说法,存不存在只是行业规范为了提高代码可读性所做的注释的可能性呢?
我尝试在网上搜索,除了认同第一行作用的说法以外,也确实有人质疑第一行只是普通注释[附]。
 
因为在写脚本的时候也会有不写所谓第一行也能执行的情况。
作出这样的揣测也不是毫无道理,毕竟亲测在ubuntu的gedit编辑器支持高亮的情况下,我们看到的代码是这样的,第一行跟注释行颜色是一样的:
shell脚本第一行:#!/bin/bash的含义
 
你再看仔细一点!第一行跟第二行真的是一样的吗?
没错,我们可以看到第一行的字体被加粗了。
是因为我第一行写了路径所以加粗了?再接着看:
shell脚本第一行:#!/bin/bash的含义
不管写什么,第一行的#!内容都会加粗。那么接着去除#后面的!:
shell脚本第一行:#!/bin/bash的含义
 
将第一行的#!改为#后变为了正常的注释,而且重点是第二行的#!部分从字体上看也成了注释,没有指定路径的功能了。
gedit居然帮我们解释了一切。
 
当然如果你还是不放心,可以试着执行一下(当然记得执行前先用chmod给文件加上执行权限):
shell脚本第一行:#!/bin/bash的含义
乱写第一行的结果就是得到一个完美的报错。
 
结论:第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。
 
附:关于linux系统bash shell编程中开头#!/bin/bash的理解
在shell编程中,shell脚本开头第一句通常是#!/bin/bash,关于本句的理解,网上存在争论,今天我做了点实验,结果证明本句没有任何意思,只是编程人员的一种规范化的编程格式。
"#"这个符号在shell脚本中是注销符号后面语句的意思,我编写了如下一段代码,放在test.sh文件中,如下:
//*******test.sh******
#slz
//*******end*********
运行:
#> sh test.sh
运行正确,表明脚本内的代码#slz没有执行,否则应该会报错。
"!"这个符号只是格式,没有什么实际含义,也没有作用,我编写如下代码测试:
//********test1.sh*******
#!slz
//********end************
运行:
#> sh test1.sh
运行没有报错,表示脚本中内容已被注释。
//**********test2.sh*******
!slz
//**********end************
运行:
#> sh test2.sh
出错,表示"!"只是普通字符,没有特别含义。
有人说本句是为了解释本程序是bash shell脚本程序,并且让系统在/bin/bash下寻找解释程序。
我把本句删除,照样可以运行,如下:
//*********test3.sh*********
echo "hello world"
//*********end***************
运行:
#> sh test3.sh
运行成功,终端显示hello world
说明#!/bin/bash并不是在告诉系统解释器的位置的作用。
综上验证,#!/bin/bash这一句没有任何意义,为了遵守规范,还是加上,有利于加强程序的可读性。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29734.html