这里写目录标题
一、Shell脚本概述
1.1、Shell脚本的概念
●将要执行的命令按顺序保存到一个文本文件
●给该文件可执行权限
●可结合各种Shell控制语句以完成更复杂的操作
1.2、Shell脚本应用场景
应用场景:
●重复性操作
●交互性任务(人可以和脚本交互,人根据脚本进行输入,脚本完成人想执行的操作)
●批量事务处理
●服务运行状态监控
●定时执行任务
1.3、Shell编程规范
1.3.1、Shell的作用
●命令解释器,“翻译官”
●介于系统内核与用户之间,负责解释命令行
用户登录Shell
登陆后默认使用的Shell程序,一般为 /bin/bash
不同Shell的内部指令、运算环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
1.4、编写Shell脚本
1.4.1、编写脚本代码
●使用vim文本编辑器
●每一条Linux命令,按执行顺序依次编写
●脚本后缀为.sh
#!/bin/bash
cd boot
pwd
ls -lh vml*
[root@localhost opt]# vim first.sh
#!/bin/bash
cd /boot
pwd
ls -lh vm*
~ '保存退出'
[root@localhost opt]# ls
first.sh rh
1.4.2、执行脚本文件(三种方法)
●方法一:sh脚本文件路径
[root@localhost opt]# sh first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 7月 13 18:58 vmlinuz-0-rescue-1b205870ecba4bd9adfd9b53e0c5f1f9
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
●方法二:source脚本文件路径
[root@localhost opt]# source first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 7月 13 18:58 vmlinuz-0-rescue-1b205870ecba4bd9adfd9b53e0c5f1f9
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
●方法三:.空格脚本文件路径
[root@localhost opt]# . first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 7月 13 18:58 vmlinuz-0-rescue-1b205870ecba4bd9adfd9b53e0c5f1f9
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
●方法四:脚本文件路径(绝对路径与相对路径)
[root@localhost opt]# ./first.sh
-bash: ./first.sh: 权限不够
[root@localhost opt]# chmod +x first.sh
[root@localhost opt]# ./first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 7月 13 18:58 vmlinuz-0-rescue-1b205870ecba4bd9adfd9b53e0c5f1f9
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
1.4.3、更完善的脚本构成
●脚本声明
●注释信息
●可执行语句
#!/bin/bash
cd /boot
echo "当前所在位置:"
pwd
echo "以vml开头的文件信息:"
ls -lh vml*
[root@localhost opt]# ./first.sh
当前所在位置:
/boot
以vml开头的文件信息:
-rwxr-xr-x. 1 root root 6.4M 7月 13 18:58 vmlinuz-0-rescue-1b205870ecba4bd9adfd9b53e0c5f1f9
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
1.4、管道与重定向
1.4.1、交互式硬件设备
●标准输入:从该设备接收用户输入的数据
●标准输出:通过该设备向用户输出数据
●标准错误:通过该设备报告执行出错信息
1.4.2、重定向操作
1.4.3、管道操作符号“|”
将左侧的命令输出结果,作为右侧命令的处理对象(前后有关系时使用)
[root@localhost ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
chenjian:x:1000:1000:chenjian:/home/chenjian:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
amandabackup /bin/bash
postgres /bin/bash
chenjian /bin/bash
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 5.7G 45G 12% /
devtmpfs devtmpfs 894M 0 894M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 11M 900M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 181M 834M 18% /boot
/dev/mapper/centos-home xfs 247G 37M 247G 1% /home
tmpfs tmpfs 182M 4.0K 182M 1% /run/user/42
tmpfs tmpfs 182M 24K 182M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
[root@localhost opt]# df -Th | awk '{print $1,$6}' ‘查看第1.6列的数据’
文件系统 已用%
/dev/mapper/centos-root 12%
devtmpfs 0%
tmpfs 0%
tmpfs 2%
tmpfs 0%
/dev/sda1 18%
/dev/mapper/centos-home 1%
tmpfs 1%
tmpfs 1%
/dev/sr0 100%
二、shell脚本变量
2.1、shell变量的作用,类型
变量的值存在内存当中
变量名不能改,系统预设
变量值,用户可以设置改变
变量的类型:
自定义变量
特殊变量:环境变量,只读变量,预定义变量
●变量的作用
●用来存放系统和用户需要使用的特定参数(值)
●变量名:使用固定的名称,由系统预设或用户定义
●变量值:能够根据用户设置、系统环境的变化而变化
●变量的类型
●自定义变量:由用户自己定义、修改和使用
●特殊变量:环境变量,只读变量,位置变量,预定义变量
2.2、自定义变量
2.2.1、定义一个新的变量与查看变量的值
●变量名以字母或下划线开头,区分大小写,建议全大写
变量名在左,变量值在右,=是赋值符号,不是等于
想看变量的值要在变量名之前加$
重启机器就没了,想要永久保存变量值就保存到新建文件夹或者存储到数据库内
变量名=变量值
代表将右边的值赋予左边
查看变量的值:echo $变量名
[root@localhost opt]#
[root@localhost opt]# num1=10
[root@localhost opt]# echo $num1
10
[root@localhost opt]# name=ky
[root@localhost opt]# echo $name$num1
ky10
2.2.2、赋值时使用引号
●双引号:允许通过$符号引用其他变量值
●单引号:禁止引用其他变量值,$视为普通字符
●反撇号:命令替换,提取命令执行后的输出结果
[root@localhost opt]# num2="test $num1" ##允许通过$符号引用其他变量值
[root@localhost opt]# echo $num2
test 10
[root@localhost opt]# num2='test $num1' ##禁止引用其他变量值,$视为普通字符
[root@localhost opt]# echo $num2
test $num1
[root@localhost opt]# num3=`ps -aux |wc -l` ##命令替换,提取命令执行后的输出结果
[root@localhost opt]# echo $num3
222
[root@localhost opt]# num4=$(ps -aux |wc -l)
[root@localhost opt]# echo $num4
222
从键盘输入内容为变量赋值
read [-p "提示信息"] 变量名
[root@localhost opt]# read -p "请输入一个整数: " sum
请输入一个整数: 150
[root@localhost opt]# echo $sum
150
从键盘输入内容为变量赋值
#!/bin/bash
read -p "请输入一个暗号:" num
echo "你的成绩是:$num"
[root@localhost opt]# ./first.sh
请输入一个暗号:99
你的成绩是:99
2.2.3、设置变量的作用范围
格式一:export 变量名...
格式二:export 变量名=变量值...
两种格式可以混合使用
[root@localhost opt]# num1=10
[root@localhost opt]# echo $num1
10
[root@localhost opt]# bash ##进入bash变量
[root@localhost opt]# echo $num1
##无法显示
[root@localhost opt]# exit
exit ##退出bash变量
[root@localhost opt]# echo $num1
10
[root@localhost opt]# export num1=10 ##赋予全局变量,全局声明变量
[root@localhost opt]# echo $num1
10
[root@localhost opt]# bash ##进入bash变量
[root@localhost opt]# echo $num1
10 ##显示出来了
2.2.4、整数变量的运算和常用运算符
●整数变量的运算
expr 变量1 运算符 变量2 【运算符 变量3】...
●常用运算符
●加法运算:+
●减法运算:-
●乘法运算:*
●除法运算:/
●求模(取余)运算:%
[root@localhost opt]# expr 3+2 ##错误格式,没加空格
3+2
[root@localhost opt]# expr 3 + 2 ##加法运算
5
[root@localhost opt]# expr 3 - 2 ##减法运算
1
[root@localhost opt]# expr 3 * 2 ##错误格式
expr: 语法错误
[root@localhost opt]# expr 3 \* 2 ##乘法运算
6
[root@localhost opt]# expr 3 / 2 ##除法运算
1
[root@localhost opt]# expr 3 % 2 ##取余运算
1
2.3、特殊的Shell变量
2.3.1、环境变量和特殊的环境变量
环境变量
●由系统提前创建,用来设置用户的工作环境
●配置文件: /etc/profile、~/.bash_profile
常见的环境变量
●PWD、PATH
●USER、SHELL、HOME
只读变量
●用于变量值不允许被修改的情况
[root@localhost opt]# name=cloud
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
cloud
[root@localhost opt]# name=yun
bash: name: 只读变量
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
位置变量
●表示为$n,n为1~9之间的数字
[root@localhost~]#.myprog.sh one two three four five six
#!/bin/bash
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
sum=`expr $a + $b`
echo "和为:$sum"
[root@localhost opt]# vim first.sh
[root@localhost opt]# ./first.sh
请输入第一个整数:20
请输入第二个整数:30
和为:50
[root@localhost opt]# ./first.sh
请输入第一个整数:90
请输入第二个整数:100
和为:190
#!/bin/bash
echo "所输入的数字为:" $3 $2 $1
[root@localhost opt]# ./first.sh 1 2 3
所输入的数字为: 3 2 1