学习各种脚本,linux下开发,这些东西都离不开bash的学习。下面列了些bash在学习过程中的一些值得注意的要点。
关于变量:
1,bash中可以使用变量名,我们可以把变量名的解析看成字符串的替换,因为bash不是强类型语言。比如我们定义个变量:
var=54
其中变量名为var,它代表了字符串“54”,而不是一个整数54。bash中变量没有类型。
2,bash中变量可以在使用的同时就是定义。如果你使用一个变量,但是以前都没有地方定义过,那么这个变量就是空的。
3,bash中的变量都是全局变量,只要在任何一个地方定义了(包括在函数里面),那么之后运行的代码都可以使用这个变量。如果想在函数里面定义个临时变量,可以在变量前面加个local来修饰,这样就是定义了个临时变量,在函数结束的时候,这个临时变量将失效。
4,变量的赋值就是定义,并且需要注意‘=’两边不能有空格。需要了解,有些编程语言会用<非字母字符>当成词法分析时的分隔符,但是bash只是用<空格>作为单词的分隔符,没有空格,就是一个完整的单词。如
if[-z ${JAVA} ]
if 后面要有空格,否则 就是 if[,连在一起当成一个单词,这个单词显然不是关键字if。[后面也必须要有空格,否则,[-z当成一个单词,显然也不等于关键字[.总之,bash先做词法分析,用空格分割出一个一个的单词,再去分析这个单词是啥含义。
5, 用引号把变量框起来使用,防止变量的内容为空,或者包含空格,特别是用 if 语句来判断一个变量的值。如:
if [ -z ${JAVA} ]
如果没有按照 JAVA,变量就是为空,语句就是
if [ -z ]
明显错误,-z 后面必须要有判断的对象。如果对变量加上引号:
if [ -z “${JAVA}” ] 变成 if [ -z “” ], 正确的判断格式。
6, bash是一种解释语言。bash在执行的时候是读一句,执行一句,没有预编译的过程。可以说,写bash的代码,不存在“语法错误”这个概念,你如果写错了,bash会按自己理解的方式来执行。比如赋值语句中“=”两边不能有空格,如果你有空格,无所谓,bash会按其他方式来解释你写的代码,然后继续执行。具体来讲
var = 54
这句话,bash理解成环境路径里面有个可执行程序叫 var,执行这个程序,同时传递给它2个参数,第一参数是“=”,第二个参数是“54”。结果当然是报错“找不到可执行程序var”收尾。(总之,当你写的代码bash穷举自己的理解方式都理解不了的时候,bash就把它当成一个可执行程序来执行)
7,获取执行脚本本身所在目录的绝对路径方法:
$(cd "$(dirname "$0")" && pwd)
$0表示脚本本身,dirname取其所在目录(注意,这个目录可能是相对目录),cd 到这个目录, 通过pwd命令把绝对路径返回。由于有小括号,表示在subshell里面执行cd命令,当subshell退出的时候,父shell本身的当前目录是不改变的。