文章目录
一:shell脚本概述
1.1:shell的作用
1.1.1:shell脚本的概念
-
Shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
命令解释器,“翻译官”
1.1.2:Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
1.2:shell编程规范
1.2.1用户的登录Shell
-
登录后默认使用的Shell 程序,一般为 /bin/bash
不同Shell的内部指令,运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
'用type查看是不是内部命令,有存在文件的是外部命令'
[root@localhost ~]# type mkdir
mkdir 是 /usr/bin/mkdir
[root@localhost ~]# type which
which 是 `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 的别名
[root@localhost ~]# type cd
cd 是 shell 内嵌
1.2.2:编写Shell脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
- 脚本后缀为.sh
- 赋予可执行权限
- 例如,将一下三条命令按顺序用shell脚本编写
cd /boot
pwd
ls -lh vm*
[root@localhost ~]# vim demo.sh
#!/bin/bash 'shell脚本标准格式,启用bash环境'
cd /boot
pwd
ls -lh vm*
~ '保存退出'
[root@localhost ~]# ls
demo.sh
[root@localhost ~]# chmod + x demo.sh
[root@localhost ~]# chmod +x demo.sh
[root@localhost ~]# ll demo.sh
-rwxr-xr-x. 1 root root 36 7月 15 19:12 demo.sh
1.2.3:Shell脚本的执行
-
方法一:./脚本文件路径(绝对路径与相对路径)
./ 一定要执行权限(可以是绝对也可以是相对路径)不改变环境
[root@localhost ~]# ./ demo.sh -bash: ./: 是一个目录 './与脚本间不能有空格' [root@localhost ~]# ll demo.sh -rw-r--r--. 1 root root 36 7月 15 19:12 demo.sh [root@localhost ~]# ./demo.sh -bash: ./demo.sh: 权限不够 [root@localhost ~]# chmod +x demo.sh [root@localhost ~]# ./demo.sh /boot -rwxr-xr-x. 1 root root 6.4M 7月 2 18:56 vmlinuz-0-rescue-9fe9a4677f874f539bbac9cfa7c01d24 -rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64 [root@localhost ~]#
-
方法二:sh 脚本文件路径
sh * .sh 不需要执行权限,本身环境不发生变化
[root@localhost ~]# ll demo.sh -rw-r--r--. 1 root root 36 7月 15 19:12 demo.sh [root@localhost ~]# sh demo.sh /boot -rwxr-xr-x. 1 root root 6.4M 7月 2 18:56 vmlinuz-0-rescue-9fe9a4677f874f539bbac9cfa7c01d24 -rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64 [root@localhost ~]#
-
方法三:source 脚本文件路径
source *.sh (要有空格)不需要执行权限,本身环境发生了变化
[root@localhost opt]# source demo.sh /boot -rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f -rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64 [root@localhost boot]# '会切换shell环境'
-
方法四:. 脚本文件路径
方法同source ,两者与脚本文件之间要有空格
[root@localhost ~]# . demo.sh '会自动切换到目标文件夹,所以文件夹需要切换回/opt' /boot -rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f -rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64 [root@localhost boot]# [root@localhost boot]# ll demo.sh ls: 无法访问demo.sh: 没有那个文件或目录 '目录环境发生变化'
-
source与 . 执行脚本,涉及到切换路径时,source和.空格会切换路径,但sh不会切换路径
./类似于sh,不切换路径
没有权限时,四种方式,.空格 sh和source可以执行,./不可以执行。有权限时,四个都可以执行
1.2.4:完善脚本
-
脚本声明
注释信息
可执行语句
-
[root@localhost ~]# vim demo.sh #!/bin/bash #This is my first shell-script '脚本描述信息' cd /boot echo "当前所在路径:" '输出友好提示信息' pwd echo "以vm为开头的文件是:" '输出友好提示信息' ls -lh vm* [root@localhost opt]# ./demo.sh 当前所在路径: /boot 以vm为开头的文件是: -rwxr-xr-x. 1 root root 5.7M Oct 23 14:07 vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f -rwxr-xr-x. 1 root root 5.7M Aug 23 2017 vmlinuz-3.10.0-693.el7.x86_64
1.3:重定向与管道
1.3.1:交互式硬件设备
-
标准输入:从该设备接收用户输入的数据
-
标准输出:通过该设备向用户输出数据
-
标准错误:通过该设备报告执行出错信息
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 设备文件 文件描述编号 默认设备 标准输入 /dev/stdin 0 键盘 标准输出 /dev/stdout 1 显示器 标准错误输出 /dev/stderr 2 显示器
1.3.2:交互式硬件设备
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出,标准错误的内容保存到同一个文件中 |
[root@localhost ~]# cat demo.sh > test.txt
[root@localhost ~]# cat test.txt
#!/bin/bash
cd /boot
pwd
ls -lh vm*
[root@localhost ~]# cat demo.sh >> test.txt
[root@localhost ~]# cat test.txt
#!/bin/bash
cd /boot
pwd
ls -lh vm*
#!/bin/bash
cd /boot
pwd
ls -lh vm*
[root@localhost ~]# cat abc.txt 2>err.txt
[root@localhost ~]# cat err.txt
cat: abc.txt: 没有那个文件或目录
[root@localhost ~]# cp err.txt 2>>err.txt
[root@localhost ~]# cat err.txt
cat: abc.txt: 没有那个文件或目录
cp: 在"err.txt" 后缺少了要操作的目标文件
Try 'cp --help' for more information.
[root@localhost ~]# cp err.txt &> err.txt
[root@localhost ~]# cat err.txt
cp: 在"err.txt" 后缺少了要操作的目标文件
Try 'cp --help' for more information.
1.3.3:管道符号“|”
-
将左侧的命令输出结果,作为右侧命令的处理对象(前后有关系时使用)
-
相当于流水线的上下工位交接过程
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}' root /bin/bash ljz /bin/bash [root@localhost ~]# '此间的-F:指定以:为分隔符 ; 输出第一列和第七列' '-F不指定分隔符,默认分隔符是空格或者制表符'
[root@localhost ~]# df -Th | awk '{print $1,$6}' 文件系统 已用% /dev/sda2 3% devtmpfs 0% tmpfs 0% tmpfs 1% tmpfs 0% /dev/sda5 1% /dev/sda1 1% tmpfs 1% tmpfs 0% tmpfs 1% /dev/sr0 100%
二:shell 脚本变量
2.1:开发语言概述
-
开发语言简单举例:shell,Python,Java,JavaScript,HTML,CSS
-
强语言:定义变量时需要声明数据类型:如 Java,C语言等
-
整型:int ,如1 ,2 ,3, ,100,等
长整型:Long
浮点型
单精度,float,4字节,如3.14
双精度,double,8字节
String:字符串
char ,字符 ‘a’ 1字节(Java中 ‘a’ 2字节),'男’2字节
boolean,布尔值,true or false
date,日期
int a=10; -
弱语言:不需要声明,如shell,JavaScript,Python
-
shell变量直接定义,不需要声明,没有面向对象思想,所有的语言编写犹如记流水账
2.2:变量概念
-
变量的作用
为灵活管理Linux系统提供特定参数,有两层意思
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置,系统环境的变化而变化 -
变量的类型
-
- 自定义变量:由用户自己定义,修改和使用
-
- 环境变量:由系统维护,用于设置工作环境
-
- 位置变量:通过命令行给脚本程序传递参数
-
- 预定义变量:bash中内置的一类变量,不能直接修改
2.3:自定义变量
2.3.1:定义一个新的变量与查看变量的值
-
变量名以字母或下划线开头,区分大小写,建议全大写变量名=变量值
代表将右边的值赋予左边变量名=变量值
-
查看变量的值:echo $变量名
-
注:
变量名不能以数字开头
1a不行,a1可以,是变量
变量名在左,变量值在右
中间的=是赋值,而不是等于,等于是==
调用变量$+变量名
[root@localhost ~]# num=10 [root@localhost ~]# echo $num 10 [root@localhost ~]# addr=$num [root@localhost ~]# echo $addr 10 [root@localhost ~]# name=key [root@localhost ~]# echo $name$num key10 [root@localhost ~]# echo $name $num key 10 [root@localhost ~]# echo $namenum [root@localhost ~]#
2.3.2:赋值时使用引号与从键盘输入内容为变量赋值
-
赋值时使用引号
-
双引号:允许通过$符号引用其他变量值
-
单引号:禁止引用其他变量值,$视为普通字符
-
反撇号:命令替换,提取命令执行后的输出结果
[root@localhost ~]# num2="test $num" '双引号:允许通过$符号引用其他变量值' [root@localhost ~]# echo $num2 test 10 [root@localhost ~]# num2='test $num' '单引号禁止引用其他变量值,$视为普通字符' [root@localhost ~]# echo $num2 test $num [root@localhost ~]# num=`ps aux | wc -l` '反撇号中识别命令,对命令结果进行解析' [root@localhost ~]# echo $num 195 [root@localhost ~]# num3=$(ps aux | wc -l) [root@localhost ~]# echo $num3 195
-
从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
[root@localhost ~]# vim demo.sh #!/bin/bash #This is my first shell-script read -p "请输入一个整数:" score echo "你的成绩为:$score" ~ [root@localhost ~]# ./demo.sh 请输入一个整数:80 你的成绩为:80
-
2.3.3:设置变量的作用范围
-
格式一:export 变量名…
格式二:export 变量名=变量值…
两种格式可以混合使用 -
[root@localhost ~]# num=`ps aux | wc -l` [root@localhost ~]# echo $num 156 [root@localhost ~]# bash '设置变量作用范围' [root@localhost ~]# echo $num '显示不出来' [root@localhost ~]# exit '退出变量范围' exit [root@localhost ~]# echo $num 156 [root@localhost ~]# export num '使用export设置变量' [root@localhost ~]# bash '变量范围' [root@localhost ~]# echo $num '生效' 156 [root@localhost ~]#
2.3.4:整数变量的运算和常用运算符
-
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]...
常用运算符: 加法运算:+ 减法运算:- 乘法运算:\* 除法运算:/ 求模(取余)运算:% 特别注意:加减乘除运算符要与数值之间要有空格
[root@localhost ~]# expr 3 * 2 expr: 语法错误 [root@localhost ~]# expr 3 \* 2 6 [root@localhost ~]# expr 3% 2 expr: 语法错误 [root@localhost ~]# expr 3 % 2 1 [root@localhost ~]# expr 3 / 2 1 [root@localhost ~]# sum=`expr 3+3` [root@localhost ~]# echo $sum 3+3 [root@localhost ~]# sum=`expr 3 + 3` [root@localhost ~]# echo $sum
2.4:特殊变量
2.4.1:环境变量和常见的环境变量
-
环境变量
-
由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile,~/.bash_profile -
常见的环境变量
PWD,PATH
USER,SHELL,HOME
2.4.2:位置变量
表示为$n,n为1-9之间的数字
[root@localhost ~]#./demo.sh one two three four five six
注意:脚本为$0 往后依次1~6
[root@localhost ~]# vim test.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "和为$sum"
[root@localhost ~]# sh test.sh 20 30
和为50
[root@localhost ~]# !vim
vim test.sh
[root@localhost ~]# vim test.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "和为$sum"
echo "执行脚本的是:$0"
echo "位置变量的个数是:$#"
[root@localhost ~]# sh test.sh 20 30
和为50
执行脚本的是:test.sh
位置变量的个数是:2
[root@localhost ~]# vim test.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "和为$sum"
echo "执行脚本的是:$0"
echo "位置变量的个数是:$#"
echo "详细内容是:$*"
[root@localhost ~]# sh test.sh 20 30 40 50
和为50
执行脚本的是:test.sh
位置变量的个数是:4
详细内容是:20 30 40 50
[root@localhost ~]# vim test.sh
#!/bin/bash
sum=0
sum=`expr $1 + $2`
echo "是否成功$?"
echo "和为$sum"
echo "执行脚本的是:$0"
echo "位置变量的个数是:$#"
echo "详细内容是:$*"
[root@localhost ~]# sh test.sh 20 30
是否执行成功0
和为50
执行脚本的是:test.sh
位置变量的个数是:2
详细内容是:20 30
2.4.3:预定义变量
- $#:命令行中位置变量的个数
- $*:所有位置变量的内容
- $?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
- $0:当前执行的进程/程序名
- 分析脚本