安装脚本中的shell基本知识点总结
本文讲述了在Install.sh脚本中出现的shell相关语法,这可以帮助无shell编程基础的人员扫清语法障碍,快速理解脚本的意图。
1. “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。Shell脚本解释器的种类有bash、sh、csh、ksh等,bash是Linux标准默认的shell。
2. main函数为脚本的主函数,脚本执行的入口
3. if ... fi语句:
如果[]内的表达式返回true,then后边的语句将会被执行;如果返回false,不会执行任何语句。最后必须用fi结尾来闭合if。
4. 命令替换
$(id -u):$(cmd)的意思是将cmd执行一次,并用标准输出替换$(cmd)。其等价于`cmd`,即用反引号包含命令,反引号是键盘上Esc下面的符号。
5. 条件测试—整数测试
if [ $(id -u) -ne 0 ]:条件表达式要放在方括号中,并且[]和表达式之间要有空格,否则会有语法错误。[为一个shell命令,其语法为:[ expression ]
方括号也可以用test命令代替,test命令的语法为:test expression
其中 –ne 为关系运算符,用于检测两个数是否相等。
表1:整数运算符列表 |
||
运算符 |
说明 |
举例 |
-eq |
检测两个数是否相等,相等返回 true。 |
[ $a -eq $b ] 返回 true。 |
-ne |
检测两个数是否相等,不相等返回 true。 |
[ $a -ne $b ] 返回 true。 |
-gt |
检测左边的数是否大于右边的,如果是,则返回 true。 |
[ $a -gt $b ] 返回 false。 |
-lt |
检测左边的数是否小于右边的,如果是,则返回 true。 |
[ $a -lt $b ] 返回 true。 |
-ge |
检测左边的数是否大等于右边的,如果是,则返回 true。 |
[ $a -ge $b ] 返回 false。 |
-le |
检测左边的数是否小于等于右边的,如果是,则返回 true。 |
[ $a -le $b ] 返回 true。 |
6. 变量的使用
${INS_DEBUG_ERROR}:使用一个定义过的变量,只要在变量名前面加美元符号$即可,变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。推荐给所有变量加上花括号,这是个好的编程习惯。
check_input_param是脚本里定义的一个函数,定义函数的一般格式如下:
function_name () {
list of commands
[ return value ]
}
函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
Shell 函数返回值只能是整数(0~255),一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。
如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值,通过echo语句将数据返回。
调用函数时只需要给出函数名,不需要加括号。当用户定义一个函数后,实际上该函数就成为一个合法的shell命令。在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,
8. 特殊变量
retVal=$?:其中$?为特殊变量(又称系统变量),此处代表上个函数check_input_param的返回状态,0代表成功,非0代表失败。
表2:特殊变量列表 |
|
变量 |
含义 |
$0 |
当前脚本的文件名 |
$n |
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。当n>=10时,需要使用${n}来获取参数。 |
$# |
传递给脚本或函数的参数个数。 |
$* |
传递给脚本或函数的所有参数。 |
$@ |
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? |
上个命令的退出状态,或函数的返回值。 |
$$ |
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
$! |
Shell最后运行的后台Process的PID |
9. 条件测试—字符串测试
if中的[ —字母 ]代表的意思:
[ -z STRING ] “STRING” 的长度为零则为真
String1 = string2 等于,如:if [ "$a" = "$b" ]
String1 != sring2 不等于,如:if [ "$a" == "$b" ],与=等价
[ -d FILE ] 如果FILE存在且是一个目录则为真。
10. >和>>都是重定向输出,>会覆盖已有的文件内容,而>>会附加到已有内容之后。
1> 指标准信息输出路径(也就是默认的输出方式)
2> 指错误信息输出路径
2>&1 指将标准信息输出路径指定为错误信息输出路径(也就是都输出在一起)
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null,如果这样写command > /dev/null 2>&1,即代表屏蔽 stdout 和 stderr
11. Here Document:目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document是Shell中的一种特殊的重定向方式,它的基本的形式如下:
command << delimiter
document
delimiter
它的作用是将两个delimiter之间的内容(document)作为输入传递给command。结尾的delimiter 一定要顶格写。
12. 变量作用域
全局变量:
在脚本中定义的变量为全局变量,作用域为被定义的地方开始到脚本结束或被显示地删除处为止。函数体内部的变量默认也是全局变量,其作用域为“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。
局部变量:
关键字为local,如果变量被定义为local,其作用域变为函数体内。另外,函数的参数也是局部变量。
当局部变量和全部变量同名时,函数内部的局部变量会优先被使用。
环境变量:一般是指在操作系统中用来指定操作系统运行环境的一些参数,是所有shell程序都可以使用的变量。常用的有PATH、HOME、TMOUT、PWD等等。按照惯例,shell中的环境变量都使用大写字母表示。
上图中PWD就是一个环境变量,用于记录当前工作目录。
export:设置新的环境变量。例如$ export TEST="Test..." #增加一个环境变量TEST
env:显示所有环境变量。
13. 引用
单引号:
可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。
双引号:
把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。
不加引号:
如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来;如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号。一般连续的字符串,数字,路径等可以用。
在echo命令中,双引号可有可无,单引号主要用于原样输出
- 点赞
- 收藏
- 关注作者
评论(0)