一、Shell脚本编程规范
1.1 Shell脚本应用场景
- Shell脚本(Shell Script)就是将要执行的命令按照顺序保存到一个文本文件中,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或者管理,可结合Shell控制语句完成复杂操作。
- 一般用于重复性操作、批量事务处理、自动化运维、服务状态运行监控、定时任务执行等。
1.2 Shell脚本编程规范
- Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并解释,将操作传递给内核执行,并输出执行结果。
1.2.1 Shell解释器种类
- 解释器种类由很多种,不同的Shell脚本,内部指令,命令提示会有一些区别
cat /etc/shells 查看当前系统所支持的脚本种类
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
1.2.2 Shell脚本编辑
[root@localhost opt]# vim first.sh ## 脚本文件以.sh 结尾
#!/bin/bash ## Shell解释器的程序为/bin/bash
#注释
cd /boot
pwd
ls -lh vml*
1.2.3 Shell脚本执行
三种方式:
- ./路径 ## 可绝对可相对 要有可执行X权限
- sh 路径 ## 可以不需要执行权限 一般建议给 执行后路径不变,本身的环境未发生变化
- source first.sh ## 路径变了,本身的环境发生了变化 , . xxx ## 等同于source
- ./l路径
以刚才创建的Shell脚本为例子
[root@localhost opt]# ll
总用量 8
-rw-r--r--. 1 root root 116 7月 15 17:19 first.sh ## 目前的权限里面没有可执行权限
[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 6月 22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost opt]# ## 路径未发生变化
[root@localhost opt]# sh first.sh ##
/boot
-rwxr-xr-x. 1 root root 6.4M 6月 22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost opt]# ## 所在位置未变化 环境未发生改变
[root@localhost opt]# source first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 6月 22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost boot]# ##所在位置变化 环境发生改变
[root@localhost opt]# . first.sh
/boot
-rwxr-xr-x. 1 root root 6.4M 6月 22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost boot]# ##所在位置变化 环境发生改变
1.2.4 Shell脚本输出提示性信息
- echo “当前目录位于:” ## 加双引号 代表字符串
[root@localhost opt]# vim first.sh
echo “当前目录位于:”
1.2.5 重定向与管道操作
类型 |
解释 |
设备文件 |
文件描述编号 |
默认设备 |
标准输入 |
从该设备接收用户输入的数据 |
/dev/stdin |
0 |
键盘 |
标准输出 |
通过该设备向用户输出数据 |
/dev/stdout |
1 |
显示器 |
标准错误输出 |
通过该设备报告执行出错信息 |
/dev/stderr |
2 |
显示器 |
类型 |
操作符 |
用途 |
重定向输入 |
< |
从指定文件读取数据,而不是从家键盘输入 |
重定向输出 |
> |
将输出结果保存到指定文件(覆盖原有内容) |
重定向输出 |
> > |
将输出结果追加到指定的文件尾部 |
标准错误输出 |
2> |
将错误信息保存到指定文件(覆盖原有内容) |
标准错误输出 |
2>> |
将错误信息追加到指定的文件中 |
混合输出 |
&> |
将标准输出、标准错误的内容保存到同一个文件当中 |
[root@localhost ~]# cat abc.txt 2> error.txt
[root@localhost ~]# cat error.txt
cat: abc.txt: 没有那个文件或目录
## 不知道结果对的还是错的的时候用
[root@localhost ~]# cat abc.txt &>error01.txt
[root@localhost ~]# cat error01.txt
cat: abc.txt: 没有那个文件或目录
[root@localhost ~]# yum install httpd -y &> /dev/null ## 将屏幕当中输出的信息导入到黑洞
管道操作符号 “|”
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
wang /bin/bash
kgc /bin/bash
bdqn /bin/bash
tom /bin/bash
lisi /bin/bash
- awk :正则表达三剑客之一 处理列
-F: 以冒号作文分隔符 (F后跟分隔的符号) 什么都不写默认以制表符和空格作为分隔(-F都不写)
print 输出
$ 位置 ## 中间用逗号隔开
二、变量
- Shell变量用来存放系统和用户所需要的特定参数(值),这些参数可根据用户的设定或系统的变化而相应变化,变量的值存在内存当中。
- 作用:
用来存放系统和用户需要使用的特定参数(值)
变量名: 使用固定的名称、由系统预设或用户定义(PATH)
变量值: 能够根据用户设置、系统环境的变化而变化
- 变量的类型:
自定义的变量:由用户自己定义、修改和使用
特殊变量、只读变量、位置变量、预定义变量($?)
2.1 定义新的变量
- 变量名以以字母或下划线开头,区分大小写,建议全部大写
- 基本格式
变量名=变量值 (变量名在左边,变量值在右边 “=”是赋值符号)
[root@localhost ~]# name=zhangsan ## 把张三赋值给name
2.2 查看和引用变量的值
- 在变量名前加符号“$”,可以引用一个变量的值
- 可以使用echo命令查看变量,可以在一条echo命令中同时查看多个变量值。
[root@localhost ~]# name=zhangsan
[root@localhost ~]# name1=wangwu
[root@localhost ~]# echo $name $name1
zhangsan wangwu
2.3变量赋值的特殊操作
- 在“=”后边指定赋值内容是为变量赋值的最基本方法,还有一些操作,可以更为灵活的为变量赋值。
2.3.1 双引号(")
- 主要起界定字符串的作用,特别是赋值内容中包含空格时,必须以双引号括起来。
- 允许通过$符号引用其他变量
[root@localhost ~]# abc=a b c ## 包含空格 无法赋值
-bash: b: 未找到命令
[root@localhost ~]# abc="a b c" ## 赋值成功
[root@localhost ~]# echo $abc
a b c
2.3.2 单引号(’)
- 当要赋值的内容中包含 “$” “ " ” “\” 等具有特殊含义的字符时,应使用单引号括起来。
- 在单引号范围内,将无法引用其他变量的值,任何字符均作为普通字符看待,但赋值内容中包含单引号,需使用“、”进行转义。
[root@localhost ~]# abc='$abc'
[root@localhost ~]# echo $abc
$abc
[root@localhost ~]# abc=ab\'c ## 辅助内容中有单引号
[root@localhost ~]# echo $abc
ab'c
2.3.3 反撇号(`)
- 主要用于命令替换,允许将执行某个命令的屏幕输出的结果赋值给变量。
- 反撇号括起来的范围必须是能够执行的命令行,否则将会出错。
[root@localhost ~]# num3=`ps aux | wc -l` ## 将进程数赋值给num3
[root@localhost ~]# echo $num3
126
- 使用反撇号难以在一行命令中实现嵌套命令的操作时,可以改用“$()”来代替反撇号操作。
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd)) ## 查询提供useradd命令程序的软件包所安装的位置
/etc/default/useradd
/etc/login.defs
2.3.4 read命令
- 是bash的内置命令。read命令用来提示用户输入信息,从而实现简单的交互过程。
- 执行时将从标准输入设备(键盘)中读入一行内容,以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个),指定的变量只有一个,则整行内容赋值给此变量。
[root@localhost ~]# read num
1
[root@localhost ~]# read num1 num2
1 2
[root@localhost ~]# echo $num $num1 $num2
1 1 2
- read命令可结合 “-p”和“-t”来设置提示信息与输入等待时间
[root@localhost opt]# vim first.sh
read -p "请输入一个数值:" sum
echo "你输入的值是:$sum"
[root@localhost opt]# sh first.sh
请输入一个数值:1
你输入的值是:1
三、 设置变量的作用范围
- 默认下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell脚本后,将无法引用父级Shell环境中定义的变量。
[root@localhost ~]# echo $num
1
[root@localhost ~]# bash ## 进入子shell环境
[root@localhost ~]# echo $num ## 环境改变无法调用
[root@localhost ~]#
3.1 全局变量
- 全局变量定义的变量能在所有子Shell环境中继续使用,可以通过内部命令Export 将指定的变量导出为全局变量
- 系统:/etc/profile 针对整个用户
- 用户变量: ~/.bash_profile
[root@localhost ~]# num2=2
[root@localhost ~]# export num2 ## 将num2指定为全局变量
[root@localhost ~]# bash ## 进入子Shell环境
[root@localhost ~]# echo $num2 ## 调用成功
2
[root@localhost ~]# export num3=3
四、数值变量的运算
- Shell变量的数值运算多用于脚本的进程控制(如循环次数、使用量比较等)。
- Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下
基本格式:
expr 变量1 运算符 变量2 [运算符 变量3]………… ## 变量为对应需要计算的数值(需以"$"符号调用)
运算符 |
意义 |
++ – |
增加及减少,可前置也可放到结尾 |
\* / % |
乘法、除法、取余 |
+ - |
加法、减法 |
< <= > >= |
比较符号 |
== ! = |
等于与不等于 |
& |
位的与 |
^ |
位的异或 |
| |
位的或 |
&& |
逻辑的与 |
|| |
逻辑的或 |
?: |
条件表达式 |
= += -= *= /= %= &= ^= <<= >>= |= |
赋值运算 a+=1 相当于 a=a+1 |
[root@localhost ~]# a=2
[root@localhost ~]# b=3
[root@localhost ~]# expr $a + $b
5
[root@localhost ~]# expr $a \* $b
6
[root@localhost ~]# expr $b \% $a
1
[root@localhost ~]# num5=`expr $a \* $b \* $a`
[root@localhost ~]# echo $num5
12
- 除了expr 变量数值常见的命令还有(())、let等。如果要执行简单的运算,只需将特定的算数表达式用“$((”和“))”括起来即可。
[root@localhost ~]# bb=$((1+2**3-4)) ## 算法为 1+2的三次方-4
[root@localhost ~]# echo $bb
5
五、特殊标量
5.1环境变量
- 环境变量指的是出于运行需要而由linux系统提前创建的一类变量,主要用于设置用户的工作环境。包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。
- 环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。
- 使用 env命令可以查看到当前工作环境下的环境变量,常见的环境变量有:
USER:表示用户名称
HOME:表示用户的宿主目录。
LANG:表示语言和字符集
PWD:表示当前所在的工作目录
PATH:表示命令搜索路径。
[root@localhost ~]# env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
- PATH 用于运行设置可执行程序的默认搜索路径,当指定文件名称来执行命令程序时,linux程序将在PATH变量指定的目录范围查找对应的可执行文件。
[root@localhost ~]# ls -lh /root/caiquan.sh ## 查看脚本位置
-rwxr-xr-x. 1 root root 1.4K 7月 17 08:55 /root/caiquan.sh
[root@localhost ~]# PATH="$PATH:/root" ## 将root添加到搜索路径
[root@localhost ~]# caiquan.sh ## 可以直接以文件名运行脚本
请输入您的出拳手势 其中 0代表拳头 1代表剪刀 2代表布 0
您出的是拳头
电脑出的是布
您输了,电脑赢了!
- linux系统中,环境变量的全局配置文件为/etc/profile,此文件定义的变量用于所有用户。
- 每个用户有自己的独立配置文件(~/.bash_profile)。
5.2 位置变量
- 在使用linux脚本程序时,方便通过命令行 为 程序提供操作参数,Bash引入了位置变量的概念。
- 执行命令行操作时,第一个字段表示命令名或者脚本程序名,其余的的字符串按照从左到右的顺序依次赋值给位置变量。
- 位置变量也称为位置参数,用$1、$2、$3、$4、$5、$6、$7表示。
[root@localhost ~]# vim adder2num.sh
#! /bin/bash
SUM=`expr $1 + $2`
echo "$1+$2 = $SUM"
[root@localhost ~]# ./adder2num.sh 52 38
52+38 = 90
5.3 预定义变量
- 预定义变量是由Bash程序预先定义好的一类变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容。
$?:表示前一条命令执行后的返回状态,返回值为0表示执行正常,返回非0值表示表示执行出现异常。
$0:表示当前执行的脚本或程序的名称。