目录
一、基本介绍
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell编程的用途:
- 对于Linux运维工程师来说,编写Shell程序来进行服务器管理。
- 对于JavaEE和Python程序员来说,编写Shell程序来进行服务器的维护或者定时备份数据库。
- 对于大数据程序员来说,编写Shell程序来管理集群。
二、Shell脚本的执行方式
2.1脚本格式要求
- 脚本以#!/bin/bash开头
- 脚本需要有可执行权限(也不是一定要有)
2.2Shell脚本的常用执行方式
方式一:
- 给Shell脚本赋予可执行权限。
- 相对路径(如 ./hello.sh)或者绝对路径(如 /root/shcode/hello.sh)执行脚本。
方式二:
- sh 相对路径(如 hello.sh)或者绝对路径(如 /root/shcode/hello.sh)执行脚本。
注意
- 方式一需要给Shell添加可执行权限,方式二则不需要。
三、变量
3.1基本介绍
- Linux Shell中的变量分为:系统变量和用户自定义变量。
- 系统变量:$HOME、$PWD、$USER、$SHELL。如通过echo $HOME可以显示当前用户的家目录。
- 显示当前Shell中所有变量:set
3.2Shell变量的定义
3.2.1基本语法
- 定义变量:变量名=值
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量(静态变量不能被撤销)
3.2.2定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格。
- 变量名称一般习惯为大写。(规范)
3.2.3将命令的返回值赋给变量
- A=`date`
- A=$(date)
这两个例子都是将date命令运行的结果赋给变量A。注意:`为反引号。
3.2.4案例
3.3设置环境变量
3.3.1基本语法
- export 变量名=变量值(定义环境变量/全局变量)
- source 配置文件(让修改后的配置文件立即生效)
- echo $变量名(查询环境变量的值)
3.3.2案例
1.在/etc/profile文件中定义TOMCAT_HOME环境变量
2.让修改后的配置文件立即生效
3.查询环境变量的值
4.在另一个shell程序中使用TOMCAT_HOME环境变量
3.4位置参数变量
3.4.1基本介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用位置参数变量。
比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。
3.4.2基本语法
位置参数变量 | 功能描述 |
$n | n为数字,$0代表命令本身,$1-$9代表第一个到第九个参数。十以上的参数需要用大括号包含,如${10}。 |
$* | 这个变量代表命令行中的所有参数,$*把所有的参数看成一个整体。 |
$@ | 这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待。 |
$# | 这个变量代表命令行中所有参数的个数。 |
3.4.3案例
编写一个shell脚本position.sh,在脚本中获取到命令行的各个参数信息。
3.5预定义变量
3.5.1基本介绍
预定义变量就是设计者事先已经定义好的变量,可以直接在shell脚本中使用。
3.5.2基本语法
预定义变量 | 功能描述 |
$$ | 当前进程的进程号(PID)。 |
$! | 后台运行的最后一个进程的进程号(PID)。 |
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来绝对),则证明上一个命令执行不正确。 |
3.5.3案例
四、运算符
4.1基本语法
- $((运算式))
- $[运算式]
- expr m + n
注意
- 这三种写法都会将运算的结果返回。
- 第三种写法注意以下几点:
- expr是expression(表达式)的缩写。
- 运算符间要有空格。
- 如果要将结果赋给变量,则使用反引号`xxx`或者$(xxx)。
- 第三种写法的部分运算符有点特别:+ - \* / % 分别表示加 减 乘 除 取余。
4.2案例
五、条件结构
5.1单分支结构
5.1.1基本语法
if [ condition ]
then
...
fi
注意
- condition前后要有空格。
- 判断条件非空即为真,为空即为假。(可用$?验证,0为true,>1为false).
- [ condition ] && echo OK 条件满足,执行后面的语句
5.1.2常用判断条件
判断条件 | 含义 | 备注 |
= | 相等 | 字符串比较 |
-lt | 小于(little) | 两个整数的比较 |
-le | 小于等于(little equal) | |
-eq | 等于(equal) | |
-gt | 大于(greater) | |
-ge | 大于等于(greater equal) | |
-ne | 不等于(not equal) | |
-r | 有读的权限 | 按照文件权限进行判断 |
-w | 有写的权限 | |
-x | 有执行的权限 | |
-f | 文件存在并且是一个常规的文件 | 按照文件类型进行判断 |
-e | 文件存在 | |
-d | 文件存在并且是一个目录 |
5.1.3案例
5.2多分支结构
5.2.1基本语法
if [ condition ]
then
...
elif [ condition ]
then
...
...
fi
5.2.2案例
请编写一个 shell程序,如果输入的参数,大于等于60,则输出及格了",如果小于60,则输出"不及格"。
5.3case语句
5.3.1基本语法
case $变量名 in
"值1")
... #如果变量的值等于1,则执行程序1
;;
"值2")
... #如果变量的值等于2,则执行程序2
;;
*)
... #如果变量的值不是以上的值,则执行此程序
;;
esac
5.3.2案例
当命令行参数是1时,输出"周一";是2时,就输出"周二"。其它情况输出"other"。
5.4read读取控制台输入
5.4.1基本语法
read 选项 变量
选项 | 说明 |
-p | 指定读取时的提示符 |
-t | 指定读取时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 |
变量:指定读取时的变量名 |
5.4.2案例
六、循环结构
6.1for循环
6.1.1基本语法
语法1
for 变量 in 值1 值2 值3
do
...
done
语法2
for(( 初始值;循环控制条件;变量变化 ))
do
...
done
6.1.2案例
6.2while循环
6.2.1基本语法
while [ condition ]
do
...
done
6.2.2案例
七、函数
7.1系统函数
语法 | 说明 |
basename [选项] 参数 | 用于打印目录或者文件的基本名称,显示最后的目录名或文件名 |
dirname [选项] 参数 | 去除文件名的非目录部分,删除最后一个“\”后面的路径,显示父目录 |
案例
7.2自定义函数
基本语法
定义函数
[function] 函数名[()]
{
...;
[return int];
}
调用函数
函数名 [值]
案例
八、综合案例(数据库备份)