前言
Shell是Linux系统中一种特殊程序,在用户终端与内核进行交互的翻译官,用户登录Linux系统时,会自动加载一个Shell程序,离开Shell操作系统将无法运行,Bash是Linux系统中默认的Shell程序。
Shell运行的过程:计算机接收用户所传输的命令,Shell会自动加载,将所接受到的命令转换成计算机所能识别的二进制语言,再将命令传递给系统内核执行。
一、Shell脚本
1、Shell的作用
1.1命令解释器
是结余系统内核与用户之间,负责解释命令行
1.2用户登录Shell
- 登录后默认使用的Shell程序,一般为/bin/bash
- 不同Shell的内部指令、运行环境等会有所区别
/bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
/bin/bash #基准于GNU的框架下发展出的Shell(目前是大多数Linux版本所采用的默认Shell)
###### nologin是奇怪的shell,可以让用户无法登陆主机
/usr/bin/sh #已经被bash所替换
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容 整合了csh,提供更多的功能。
/bin/csh #已经被/bin/bash 所替换 整合C shell,提供更多的功能
2、Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行的权限
- 可结合各种Shell控制语句已完成更复杂的操作
3、Shell脚本的作用
- 自动化完成软件的安装部署,如安装部署LAMP架构服务
- 自动化完成系统的管理,如批量添加用户
- 自动化完成备份,如数据库定时备份
- 自动化的分析处理,如网站访问量
4、Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
5、Shell脚本的构成
#!/bin/bash //脚本申明(默认解释器)
//以“#”开头的语句表示为注释信息,备注是的语句在脚本下运行时不会被执行
cd /root //进入/root目录下
echo "当前目录位于:" //echo用于输出“ ”之间的字符串
pwd //显示当前目录
echo "压缩包有:"
ls -lh *.gz //显示以gz结尾的压缩包文件
6、创建Shell程序的步骤
- 创建一个包含命令和控制结构的文件
- 修改这个文件的权限使它可以执行 # 使用 chmod +x + 脚本文件
- 检测语法错误
- 执行脚本
7、Shell脚本的执行方式
. /demo.sh #使用较多
//当前路径(绝对路径与相对路径)下执行脚本——需要有执行权限
bash demo.sh
sh demo.sh #也可以是sh < demo.sh 重定向相当于是 将脚本发送个sh执行
//这种方式可以不对脚本添加执行权限
source demo.sh #source会执行cd命令(也可以没有执行权限)
cat demo.sh | sh 获取脚本内容并执行
二、重定向与管道
1、交互式硬件设备
类型 | 设备文件 | 文件描述编号 | 默认设备 | 描述 |
---|---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 | 从该设备接收用户输入的数据 |
标准输出 | /dev/stdout | 1 | 显示器 | 通过该设备向用户输出数据 |
标准错误输出 | /dev/stderr | 2 | 显示器 | 通过该设备报告执行出错信息 |
2、重定向操作
2.1重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。
“>”意思是当原来文件中有内容的话,原来的内容会被覆盖掉
“>>”意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
2.2重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待 从键盘输入。重定向输入使用“<”操作符。 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“–stdin” 选项来识别标准输入)。
也可以通过重定向输入给用户添加密码
可以从键盘键入的内容添加到文档中去(以0为结尾做分界符,只要不输入0就可以一直输入数据内容)
2.3错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上,错误重定向使用“2>”操作符。
作用
- 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
- 还可以将无关紧要的错误信息重定向到空文件
/dev/null
中,以保持脚本输出的简洁
使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符。
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可 以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类 输出信息保存到同一个文件。
2.4混合输出
####把正确和错误的消息输入到相同的位置
1>&2 //把标准输出重定向到标准错误
2>&1 //把标准错误重定向到标准输出
3、管道操作 |
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。 在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
$bash
表
示
系
统
提
示
符
,
表示系统提示符,
表示系统提示符, 表示此用户为普通用户,超级用户的提示符是#
- bash是shell的一种,是linux下最常用的一种shell
- $bash的意思是执行一个子shell,此子shell为bash
三、Shell脚本变量
1、变量的作用
- 用来存放系统和用户需要使用的特定参数值
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化二变化
2、变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量、制度变量、位置变量、预定义变量
3、自定义变量
Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可。
格式:变量名=变量值
变量名:临时存放数据的地方
变量值:临时的可变化的数据
等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)
用echo查看和引用变量的值
通过在变量名称前添加前导符号“$”,可以引用一个变量的值,使用 echo 命令可以查看变量,可以在一条 echo 命令中同时查看多个变量值
变量名以字母或下划线开头,区分大小写,建议全大写,可以通过echo的命令查看变量的值
{ }引用变量
##转义字符
\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n
\n 换行
\t 转义后表示插入tab,即制表符
5、赋值引号的使用
5.1双引号
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略
5.2单引号
当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。
在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。输入什么就显示什么
但赋值内容中包含单引号(‘)时,需使用\’符号进行转义,以免冲突
5.3反撇号
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错
使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “$()”来代替反撇号操作,以解决嵌套的问题
6、交互式定义变量read
可以使用 Bash 的内置命令 read 来给变量赋值。
用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
####交互式定义变量(read)参数
-p 提示用户的信息
-n 定义字符数
-s 不显示用户输入的内容,常用于输入密码
###read -s -p "input your password:" pass
-t 定义超时时间,超过多长时间没输自动退出
为了使交互式操作的界面更加友好,提高易用性,read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项
7、全局变量export
为了使用户定义的变量在所有的子 shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用"$"符号),变量名之间以空格分隔.
- 格式1:export 变量名
- 格式2:export 变量名 = 变量值
8、整数变量的运算
expr运算
expr 变量1 运算符 变量2 ...
##常用运算符
加法运算:+
减法运算:-
乘法运算:\*
除法运算:/
取余运算:%
bc运算
bc <enter> #执行bc计算
#scale=n 表示保留n位小数,是bc计算的格式要求
9、位置变量
##表示为$n,n为1~9之间的数字
./text.sh first second third fouth fifth
10、只读变量
用于变量值不允许被修改的情况
name=zhangsan
readonly name #设置为只读变量
echo $name
##此时只读变量不可以在重新赋值,但是通过重启机器可以自动恢复设置的变量值
11、环境变量
- 是由系统提前创建的,用来设置用户的工作环境
- 配置文件:/etc/profile、~/bash_profile
- 常见的环境变量
11、预定义变量
$# | 命令行中位置变量的个数 |
---|---|
$* | 所有位置变量的内容 |
$? | 执行上一条命令返回后的状态,当返回值为0时,表示正常执行,非0值表示执行异常或出错 |
$@ | 表示列出所有未知参数,但是是以单的形式列出 |
$0 | 当前执行的进程/进程名 |
$! | 返回最后一个后台的进程号 |
区别不同变量区别
不同符号执行后的结果
- $*:是将参数全部都当做了一个整体
- $@:是将参数的每一个都当做了一个单独的个体
总结
- Shell脚本相当于是可以通过一个脚本同时实现多个功能
- Shell脚本的编写规范与执行方法
- 重定向变量赋值的引号用法
- 数值变量的常用运算符的使用方法
- 环境变量、只读变量、位置变量、预定义变量的用途