编程环境:centos 7 X64,相关软件:xshell6,vmware10
一、Shell介绍
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
1、什么是shell脚本?
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序。Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。大多数Linux 系统默认的 Shell是Bash,也就是/usr/bin/sh。
2、第一个 Shell 脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 hello.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,输入以下内容,然后保存文件退出。
echo "hello,world."
echo 命令用于向窗口输出文本。
3、运行 Shell 脚本有两种方法
要想执行,就加权限 chmod +x hello.sh 再执行./hello.sh
2.不加权限,直接输sh hello.sh也可
4、echo命令
Shell 的 echo 指令用于字符串的输出。命令格式:echo string
1.显示普通字符串:
echo "It is a test"
2.显示转义字符
echo "\"It is a test\""
结果将是:"It is a test"
3.显示换行
echo -e "OK! \n" # -e 开启转义
echo "It is a test"
输出结果:
OK!
It is a test
4.显示不换行
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
输出结果:
OK! It is a test
5.显示结果定向至文件
echo "It is a test" > myfile
6.显示命令执行结果
echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 '。
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014
二、Shell变量
1、Shell 变量介绍
Linux Shell 中的变量分为,系统变量和用户自定义变量。
1) 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等..
2) 显示当前 shell 中所有变量:set
2、shell 变量的定义,使用与撤销
1) 定义变量:变量名=值
2) 使用一个定义过的变量,只要在变量名前面加美元符号即可
3) 撤销变量:unset 变量
4) 声明静态变量:readonly 变量,注意:不能 unset
比如:
1:定义变量your_name
your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
2) 撤销变量 A
unset A
变量被删除后不能再次使用。unset 命令不能删除只读变量。
3) 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
readonly myUrl="https://www.google.com"
myUrl="https://www.runoob.com"
执行结果
3、定义变量的规则
1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
比如5A=200就不对
2) 等号两侧不能有空格
只能写A=100 不能写A = 100
3) 变量名称一般习惯为大写, 这是一个规范【小写也能运行】
将命令的返回值赋给变量 【以输出日期为例】
1) A=`date`反引号,运行里面的命令,并把结果返回给变量 A
2) A=$(date) 等价于反引号
【如果写A=date,表示把单词赋值给A】
4、环境变量
1) export 变量名=变量值
2) source 配置文件 (功能描述:让修改后的配置信息立即生效)
3) echo $变量名 (功能描述:查询环境变量的值)
比如:
1)在/etc/profile 文件中定义环境变量,先进入/etc/profile,在最下面增加一行export AMIAO=/opt/myamiao,然后保存,再刷新source /etc/profile
2) 查看环境变量AMIAO 的值 , echo $AMIAO 就能得到值了
5、字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
三、Shell运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
两点注意:
表达式和运算符之间要有空格,例如 2+3 是不对的,必须写成 2 + 3,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。使用的是反引号 ` 而不是单引号 '
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
执行结果
注意:乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
2.关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
实例
3.布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
4.逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
5.字符串运算符
获取字符串长度
string="abcd"
echo ${#string} # 输出 4
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
实例
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
实例
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
四、分支控制
1、if 语句语法格式:
if condition
then
command1
command2
...
commandN
fi
2、if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
3、if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
说明:
if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt,如:
if [ "$a" -gt "$b" ]
then
...
fi
如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <。
if (( a > b ))
then
...
fi
以下实例判断两个变量是否相等:
输出结果
使用 ((...)) 作为判断语句:
4、case ... esac
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case ... esac 语法格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
ase 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入 1 到 3,与每一种模式进行匹配:
五、循环语句
1、for 循环
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
例如,顺序输出当前列表中的数字:
顺序输出字符串中的字符:
2、while 循环
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:
while condition
do
command
done
以下是一个基本的 while 循环,测试条件是:如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1。运行上述脚本,返回数字 1 到 5,然后终止。
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
循环控制(break)
break用于终止整个循环的执行。
3、until 循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until 语法格式:
until condition
do
command
done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
我们使用 until 命令来输出 0 ~ 9 的数字
4、无限循环
无限循环语法格式:
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
六、函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
1、函数实例
注意点
必须在调用函数地方之前,先声明函数再调用,shell脚本是逐行运行的, 只有先运行了函数, 后面的动作才可以使用函数;这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
函数返回值在调用该函数后通过 $? 来获得。
2、函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1 表示第一个参数,$2 表示第二个参数...
使用上面的参数编写一个输出用户输入参数的示例
3、Shell程序与函数的区别
函数和shell程序比较相似,区别在于:
Shell 程序(内置命令和外部脚本文件), 外部脚本文件是在子Shell中运行, 会开启独立的进程运行;
Shell函数在当前Shell的进程中运行
七、Shell 编程综合案例
1、要求
1) 每天凌晨 2:30 备份数据库 wpfdb 到 /back/mysql/
2) 备份开始和备份结束能够给出相应的提示信息
3) 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式
比如:2021-03-12_230201.tar.gz
2、代码
#备份目的地
dir="/back/mysql/"
time=$(date +'%Y-%m-%d-%H-%M-%S')
#备份文件名
file=$dir$time'.sql.gz'
#数据库服务器名称地址
host='localhost'
#连接数据库的帐号
dname='root'
#连接数据库的密码
dpass='root'
#要备份的数据库名称
dbname='wpfdb'
echo "开始备份"
#mysqldump命令
mysqldump -h$host -u$dname -p$dpass --databases $dbname > $file
cd $dir
#打包成压缩文件
tar -zcvf $time.tar.gz $time.sql.gz
echo "备份成功"
在脚本中,要注意mysql数据库的实际情况,帐号密码数据库名称等需要根据自己的实际情况更改,包括备份目录
3、cront定时任务
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。crontab可以在指定的时间执行一个shell脚本以及执行一系列Linux命令,例如:服务器管理员定时备份数据库数据、日志等
crontab –e //修改 crontab 文件,如果文件不存在会自动创建。
crontab –l //显示 crontab 文件。
crontab -r //删除 crontab 文件。
crontab -ir //删除 crontab 文件前提醒用户。
systemctl status crond.service //查看crontab服务状态
systemctl start crond.service //启动服务
systemctl stop crond.service //关闭服务
systemctl restart crond.service //重启服务
命令格式
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
修改定时任务文件
crontab –e,加入以下内容,原来文件内容是空的,表示没有定时任务,而这里加入的back_wpfdb.sh就是前面写的脚本shell文件,这里是为了演示效果,让每一分钟执行,保存退出。
启动定时任务
systemctl start crond.service
查看效果