第一章 入门
第一章 入门
为什么要学习 Shell 编程
-
- Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
- 2)对于 JavaEE 和 Python 程序员来说,工作的需要,你的老大会要求你编写一些 Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
- 3)对于大数据程序员来说,需要编写 Shell 程序来管理集群。
功能
入门
-
脚本格式要求
-
- 脚本以#!/bin/bash 开头
-
- 脚本需要有可执行权限
-
- 脚本后缀名不要求是
.sh结尾,可以是.txt,.png,甚至是没有后缀名
- 脚本后缀名不要求是
-
-
创建并编写脚本输出
helloworld-
-
vim myshell.sh
-
-

-
- 执行脚本
-
第一种方式
-
第二种方式(不推荐)
-
- 后台执行脚本
-
-
shell 变量
-
Linux Shell 中的变量分为
-
系统变量: $HOME、$PWD、$SHELL、$USER 等等(使用
set查看所有系统变量) -
用户自定义变量
-
1)定义变量:变量名=值
-
2)撤销变量:unset 变量名
-
- 使用变量:$变量名
-
- 声明静态变量:readonly 变量名=值,注意:静态变量不能 unset,如果 unset 静态变量会报错
-
案例
-
-

-
声明环境变量的步骤
-
-
-
定义变量的规则
-
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
-
- 等号两侧不能有空格
-
- 变量名称一般习惯为大写:TOMCAT_HOME
-
-
将命令的返回值赋给变量(重点)
- 对于普通的字面量,我们可以直接通过
variable=3来赋值,如果想把 variable 的值赋值为执行命令的结果或者运算式的结果该怎么办吗? 
- 2) A=$(ls -la) 等价于反引号
- 对于普通的字面量,我们可以直接通过
-
-

-
位置参数变量
-
概念
- 当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 :
./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
- 当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 :
-
分类
- undefined 代表命令本身,undefined 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
- $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
- $@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
- $#(功能描述:这个变量代表命令行中所有参数的个数)

-
-
预定义变量
-
概念
- 就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
-
分类
- $$(功能描述:当前进程的进程号(PID))$$
- $! (功能描述:后台运行的最后一个进程的进程号(PID))
- $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了

-
-
运算符
-
概念
- 在 shell 中进行各种运算操作
-
语法
-
$((运算式))
-
⭐️ 推荐⭐️$[运算式]
-
expr
-
expr m + n:注意 expr 运算符间要有空格 -
-
乘
-
/
- 除
-
%
- 取余
-
-

-
-
-
条件判断
-

-
条件判断分类
-
文件测试语句;
-
-d 测试文件是否为目录类型
- 如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:
-
-e 测试文件或者目录是否存在
- 目录就是一种特殊的文件
-
-f 判断是否为一般文件
- 如果返回值为0,则代表文件存在,且为一般文件
-
-r 测试当前用户是否有权限读取
-
-w 测试当前用户是否有权限写入
-
-x 测试当前用户是否有权限执行
-
-
逻辑测试语句;
-
与:&&
-
表示它表示当前面的命令执行成功后才会执行它后面的命令,因为如果前面的命令执行失败,整个表达式就是错误的,所有有点类似java中短路运算
-
[ -e /dev/cdrom ] && echo "Exist"
- 因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样。
-
-
或:||
- 表示当前面的命令执行失败后才会执行它后面的命令,因为如果起那面命令执行成果,整个表达式就是成功,所以后面的不需要执行,也是短路运算
-
非:!
-

-
-
整数值比较语句;
- 因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突,所以要用别的字符代替
- eq 是否等于equal
- -ne 是否不等于not equal
- -gt 是否大于grate than
- -lt 是否小于less than
- -le 是否等于或小于less equal
- -ge 是否大于或等于grate equal
-
字符串比较语句。
- 用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)
- = 比较字符串内容是否相同
- != 比较字符串内容是否不同
- -z 判断字符串内容是否为空
-

-
-
流程控制
-
分支
-
if 分支:既可以判断范围,也可以判断值
-
case 分支:只能判断值
-
-
循环
-
for 循环
-
-
while 循环
-
-
-
-
-
read 读取控制台输入
-
引入
- 我们可以在启动脚本的时候读取用户的参数,但是无法在脚本运行的过程中读取用户的输入
-
格式
-
read 选项 参数-
选项
- -p:指定读取值时的提示符;
- -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
-
参数
- 把用户输入的数据赋值给参数处的变量
-
-
-

-
-
函数
-
系统函数
-
basename
- 语法:
basename [pathname] [suffix] - 功能:返回完整路径最后 / 的部分,常用于获取文件名

- 语法:
-
dirname
- 语法:
dirname [pathname] - 功能:从给定的包含绝对/相对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

- 语法:
-
-
自定义函数
-





























浙公网安备 33010602011771号