一、概述
1、shell 概念及作用
shell 是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把人类输入操作指令等的高级语言翻译成二进制传递给内核执行,并输出执行结果 。
目前大多数 linux 默认使用的shell 是bash ,位置在 /bin/bash 。常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
2、shell 脚本概念及作用
shell脚本本质上也是一种程序。将要执行的命令安装顺序保存到一个文本文件中,给该文件执行权限,可以结合各种shell 控制语句以完成重复性、批量性的复杂操作。脚本名以.sh 结尾,在vim书写时可以高亮显示。
二、shell 脚本的组成
①声明解释器:用来表示接下来用什么解释器来解释命令,例如:#!/bin/bash
②注释信息:以#开头的语句为注释信息
③执行命令:比如echo 命令用于输出 " " 之间的字符串
三、执行脚本方式
1、直接调用shell 解释器bash 加上脚本名的方式执行,此方法不需要给与脚本执行权限
2、脚本路径 + 脚本名的方式执行,脚本的路径写绝对路径和相对路径都可以,此方法需要给与脚本执行权限
3、使用source 或 . +脚本名的方式执行,不需要执行权限,不建议使用,因为会改变当前环境,可能会产生一些问题
四、脚本执行逻辑
1、顺序执行:程序按照从上到下的顺序执行
2、选择执行:程序执行的过程中,根据条件的不同,进行选择不同分支继续执行
3、循环执行:程序执行过程中重复执行多次某段语句
五、脚本错误调试
1、书写脚本常见错误
①命令错误:命令出错不会影响接下来的命令执行,但本条命令不执行
②语法错误:直接影响脚本无法正常运行,可以用bash -n 检查
③逻辑错误:只能自己去筛查,可以用bash -x 检查
2、安全选项
① 在脚本中写入set -e:一旦出错立即停止,不再往下执行
②在脚本中写入set -u:变量不存在不执行
六、重定向与管道符
1、重定向
重定向指改变电脑数据的输出方向,不输出到默认设备上,输出到你指定的位置,默认的输出方向是屏幕。例如我们发了一条指令给电脑操作,电脑的回复是在屏幕上,我们称之为标准输出;电脑没有正确回复,我们称之为错误输出;通过键盘、鼠标、扫描仪、话筒等输入设备给电脑传输信息和指令,我们称之为标准输入。
使用重定向输入输出:
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 使用tty查看另一台终端设备名,可以输出到别的终端设备上 |
> | 将输出结果覆盖原有内容保存到指定文件中 | |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中(无论对错都可以重定向覆盖) |
&>> | 将标准输出、标准错误的内容保存到同一个文件中(无论对错都可以重定向追加) |
2、管道符
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以叠加使用,例如:ls |wc -l。
七、shell变量
1、shell变量概述
变量是可以变化的值,用来存放系统和用户需要使用的特定参数(值)。变量由变量名个变量值组成,变量名使用固定名称,由系统预设或者用户自定义;变量值根据用户设置、系统环境的改变而改变。
2、变量使用方法
①设置变量:变量名=变量值,例:a=10
②调用变量:echo $变量名,例:echo $a;echo $a$b 表示一次调用多个变量
③删除变量:unset 变量名,例:unset a
④重新定义变量:变量名=变量值,例:a=20
⑤追加变量值:变量名+=变量值,例:a+=11
3、变量的类型
①自定义变量:由用户自定义修改和使用
②预定义变量:bash中内置的变量,不能修改,由shell (bash)维护,例如;$?、$$、$@
③环境变量:由系统维护,记录系统相关信息,env可以看到所有的环境变量
④只读变量:只可以读,不可以改,相当于常量,用的比较少
⑤位置变量:也称位置参数,使用$1、$2、$3......$9来表示
4、特殊符号
s{ } :定义的变量名的范围,建议多使用,可以见面错误
" " : 弱引用,变量在双引号中可以识别
' ': 强引用,变量在单引号中不被识别
` `:反撇号,代表引用命令执行的结果
5、变量的作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用。
6、预定义变量
$?:表示前一条命令执行结果是否正确,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前bash的进程id
$#:表示命令行中位置参数的总个数
$!: 后台任务最后一个id
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有