2021-06-11
关键字:
1、在 shell 脚本源码中实现多行注释
在源码中以冒号加两个左尖括号开头,后面加一个标签即可实现多行注释的功能。 :<<LABEL LABEL
#!/bin/bash echo "begin to comment" :<<COMMENT This content is all comment Won‘t be execute by shell And comment end with next ‘COMMENT‘ label COMMENT echo "document end"
2、shell命令中的source关键字是什么?
我们在执行某个shell脚本时,其本质是脚本解释器创建一个新的进程,并将脚本中的内容在这个新进程中逐行执行的。
souce关键字是一个shell内部的命令,它的作用是读取指定shell程序文件,且逐行执行。但souce命令与传统的执行所不同的一点是:souce不会启动新进程,而是直接在本进程中执行读取出来的程序。
正是这一点区别,才有了在sh文件中配置的环境变量在本shell中无效,而必须使用 souce + sh程序 的方式来执行才行的现象。其本质也只不过是直接执行脚本程序时所设置的环境变量属于另一个进程,而通过souce执行的才是应用在当前进程而已。
同时这也引申出,假设在某脚本文件中调用了 exit 0 命令,若直接在bash命令行中运行此脚本文件,脚本文件将正常退出。而要是以 souce 命令来执行,此会直接结束外部的 bash 会话(直接登出)。
3、在shell中显式声明变量
shell是一种弱类型的动态语言,一般来讲它无须声明变量即可直接使用。若未事先声明而直接使用,则其会在使用的同时自动定义此变量。
但显式声明变量可以对变量作某些限制,因此在某些情况下还是有必要的。
shell中显式声明变量的语法如下:
declare [attribute] [variable name]
attribute表示参数,可选的参数及释义如下表所示:
attribute | meaning |
-p | 打印当前系统中所有变量的值。 |
-i | 将variable定义为整数类型。若对整数类型变量赋了非整数值,则其值为0。 |
-r | 将variable定义为只读类型。 |
-a | 将variable声明为数组类型。事实上,shell中默认情况下变量就是数组类型。 |
-f | 打印所有自定义函数,包括名称和函数体。 |
-x | 将variable设置成环境变量。 |
值得一提的是:shell允许在中途使用declare改变某变量的类型。但临时改变的类型其值仍是改变前的,需要重新赋值才可应用上新类型。
需要注意的是:declare命令仅在 bash 中有。若有些系统使用的是 dash 若其它shell工具,可能会报declare找不到的错误。
以下是一个示例:
#!/bin/bash x=6/3 echo "x=$x" declare -i x echo "x2=$x" x=6/3 echo "x3=$x"
4、shell中变量的作用域
与大多数编程语言一样,shell程序中的变量的作用域也可分为两种:
1、全局变量;
2、局部变量;
全局变量直接声明即可,局部变量则需在函数中使用 local 关键字声明。另外,shell中函数参数也为局部变量。
注意:函数中未使用local关键字声明的变量亦为全局变量。
全局变量的作用域范围为从定义处开始直至shell脚本结束或被显式地删除该全局变量。
局部变量的作用域则仅限于函数体内部。
局部变量的优先级高于全局变量。若先定义了一个全局变量,然后在函数内部定义了一个同名的局部变量,则在函数内调用该变量名称时,引用的是局部变量的值。
5、shell中的单引号与双引号
shell的语法可以使用单引号和双引号两种方式来定义字符串内容。
其中,单引号中的所有内容均被解析为普通字符原样输出。
而双引号中的内容中 $ , \ , ‘ , " 几个字符将会被解析成特殊功能字符,剩余的字符才会被原样输出。
6、清除变量/删除变量定义
使用关键字 unset 来清除一个变量的定义。如:
unset p1
unset v1
7、定义变量时的注意事项
由于shell中规定所有命令之间都以空格字符隔开,而变量赋值的三个段本质上属于同一条命令,因此在shell中创建变量并为其赋值时等号两边不能加空格。
#!/bin/bash #正确的创建变量与赋值方式 a=3 #错误的创建变量与赋值方式 b = 5
8、shell中的数字常量表示方式
在shell中可以使用两种方式来表示数字常量:
1、使用0的前缀;
2、使用#前缀;
如:
二进制可以表示为 2#1101,只能用#前缀表示。
八进制可以表示为 020 、 072 、 8#20 、 8#72
十进制无须前后缀直接写即可。
十六进制可表示为 0x1f 、 0x66 、 16#1f 、 16#66
9、命令替换
命令替换是指将某个命令的执行结果赋给某个变量。在bash中有两种命令替换的语法:
1、`shell command`
2、 $(shell command)
10、alias别名
在shell中可以通过alias命令来为某个已有的命令取一个别名。通常的用法是将一个较复杂的命令取一个较简单的别名从而降低执行难度。其用法如下所示:
#取别名 alias nick_name="original command" #注销别名 unalias nick_name #示例 alias ll="ls -al --color=auto"
其实,alias与function是类似的,它们都是将已存在的命令做一个”封装“。只不过alias只能封装一条命令,而function可以封装任意多条命令。