课程视频:【【尚硅谷】Shell脚本从入门到实战】
一、Shell概述
为什么要学习Shell?
1)需要看懂运维人员的Shell程序
2)偶尔编写一些简单的Shell程序来管理集群、提高开发效率
什么是Shell?
1)Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。
2)Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
二、Shell解析器
Linux提供的Shell解析器有:/bin/sh、/bin/bash等。
sh实际是软连接直接指向bash
三、Shell脚本入门
1、脚本格式
以#!/bin/bash开头(指定解析器)
2、创建一个helloworld脚本
创建脚本文件:touch helloworld.sh
#!/bin/bash
echo "helloworld"
运行脚本:sh helloworld.sh或bash helloworld.sh或./helloworld.sh(用户执行,需要有权限)
3、创建一个多命令处理脚本
要求在/home/目录下创建一个banzhang.txt,在该txt文件中增加“I love cls”.
创建脚本文件:touch batch.sh
#!/bin/bash
cd /home/
touch banzhang.txt
echo "I love cls" >> banzhang.txt
运行脚本:bash batch.sh
四、Shell中的变量
系统变量
$HOME、#PWD、$SHELL、$USER等
查看变量值:echo+变量名。如:echo $HOME。
自定义变量
1)定义变量:变量=值。如:NUM=1。
2)撤销变量:unset 变量。如:unset NUM。
3)声明静态变量:readonly 变量(不能被撤销unset)。如:readonly NUMBER=2。
自定义变量定义规则
1)变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
2)等号两侧不能有空格。
3)在bash中,变量默认都是字符串类型,无法直接进行数值运算。
4)变量值如果有空格,需要使用单引号或双引号括起来。
5)把变量提升为全局环境变量,可供其他Shell程序使用:export 变量名。如:export NUMBER。
特殊变量$n、$#、$*、$@、$?
$n:其中n为数字,$0表示该脚本的名字,$1-$9表示传入脚本的1-9个参数。
#!/bin/bash
#创建一个名为parameter.sh的脚本
echo "$0 $1 $2"
运行bash parameter.sh ABC 123,会输出parameter.sh ABC 123。
$#:获取所有输入参数个数。
#!/bin/bash
#创建一个名为parameter.sh的脚本
echo "$0 $1 $2"
echo $#
运行bash parameter.sh ABC 123 abc,会输出
parameter.sh ABC 123
3。
$*:代表命令行中的所有参数,$*把所有的参数看成一个整体。
$@:代表命令行中的所有参数,$@把每个参数区分对待。
#!/bin/bash
#创建一个名为parameter.sh的脚本
echo "$0 $1 $2"
echo $#
echo $*
echo $@
运行bash parameter.sh ABC 123 abc,会输出
parameter.sh ABC 123
3
ABC 123 abc
ABC 123 abc。
$?:最后一次执行命令的返回状态。0表示正确执行,非零表示没有正确执行。
五、运算符
基本语法
1)$((运算式))或$[运算式]
2)expr + - \* /% (expr运算符之间必须有空格)
实操
计算2+3:expr 2 + 3
计算(2+3)*4,expr `expr 2 + 3` \* 4 或 $[(2+3)*4]
六、条件判断
基本语法
[ condition ](condition前后要有空格,条件非空即为true)
常用判断条件
= | 字符串比较 | ||
---|---|---|---|
-lt | 小于 | -le | 小于等于 |
-eq | 等于 | -gt | 大于 |
-ge | 大于等于 | -ne | 不等于 |
按照文件权限进行判断: | |||
-r | 有读的权限 | ||
-w | 有写的权限 | ||
-x | 有执行的权限 | ||
按照文件权限进行判断: | |||
-f | 文件存在且是一个常规文件 | ||
-e | 文件存在 | ||
-d | 文件存在且是一个目录 |
如:
判断23是否小于22:[ 23 -le 22 ]
判断helloworld.sh是否具有写权限:[ -w helloworld.sh]
多条件判断
&&表示前一条命令执行成功后,才执行后一条命令;
|| 表示上一条命令执行失败后,才执行下一条命令。