上传文件至 /
This commit is contained in:
parent
79b5b7fdd9
commit
dc573a0a04
|
@ -0,0 +1,205 @@
|
|||
<h1><center>shell数组</center></h1>
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 一:数组
|
||||
|
||||
#### 1.数组介绍
|
||||
|
||||
是若干数据的集合,其中的每一份数据都称为元素
|
||||
|
||||
shell不限制数组的大小,理论上可以存放无限量的数据
|
||||
|
||||
#### 2.数组分类
|
||||
|
||||
普通数组
|
||||
|
||||
只能使用整数作为数组索引/下标(从0开始)
|
||||
|
||||
关联数组
|
||||
|
||||
可以使用字符串作为数组索引/下标
|
||||
|
||||
#### 3.定义数组
|
||||
|
||||
##### 普通数组
|
||||
|
||||
方法一: 一次赋一个值
|
||||
|
||||
```shell
|
||||
数组名[索引]=变量值
|
||||
[root@xingdiancloud ~]# array1[0]=pear
|
||||
[root@xingdiancloud ~]# array1[1]=apple
|
||||
[root@xingdiancloud ~]# array1[2]=orange
|
||||
[root@xingdiancloud ~]# array1[3]=peach
|
||||
```
|
||||
|
||||
方法二: 一次赋多个值
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# array2=(tom jack alice)
|
||||
[root@xingdiancloud ~]# array5=(tom jack alice "bash shell")
|
||||
[root@xingdiancloud ~]# colors=($red $blue $green $recolor)
|
||||
[root@xingdiancloud ~]# array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
|
||||
[root@xingdiancloud ~]# array8=`cat /etc/passwd`
|
||||
```
|
||||
|
||||
##### 关联数组
|
||||
|
||||
申明该数组为关联数组
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# declare -A ass_array1
|
||||
[root@xingdiancloud ~]# declare -A ass_array2
|
||||
```
|
||||
|
||||
方法一: 一次赋一个值
|
||||
|
||||
```shell
|
||||
数组名[索引]=变量值
|
||||
[root@xingdiancloud ~]# ass_array1[index1]=pear
|
||||
[root@xingdiancloud ~]# ass_array1[index2]=apple
|
||||
[root@xingdiancloud ~]# ass_array1[index3]=orange
|
||||
[root@xingdiancloud ~]# ass_array1[index4]=peach
|
||||
```
|
||||
|
||||
方法二: 一次赋多个值
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')
|
||||
```
|
||||
|
||||
一步走
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
|
||||
[root@xingdiancloud ~]# declare -A ass_array2='([index4]="bash shell" [index1]="tom" [index2]="jack" [index3]="alice" )'
|
||||
```
|
||||
|
||||
#### 4.访问数组元素
|
||||
|
||||
##### 普通数组
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# echo ${array1[0]} 访问数组中的第一个元数
|
||||
[root@xingdiancloud ~]# echo ${array1[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
|
||||
[root@xingdiancloud ~]# echo ${#array1[@]} 统计数组元数的个数
|
||||
[root@xingdiancloud ~]# echo ${!array2[@]} 获取数组元数的索引
|
||||
[root@xingdiancloud ~]# echo ${array1[@]:1} 从数组下标1开始
|
||||
[root@xingdiancloud ~]# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素
|
||||
```
|
||||
|
||||
##### 关联数组
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# echo ${ass_array2[index2]} 访问数组中的第二个元数
|
||||
[root@xingdiancloud ~]# echo ${ass_array2[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
|
||||
[root@xingdiancloud ~]# echo ${#ass_array2[@]} 获得数组元数的个数
|
||||
[root@xingdiancloud ~]# echo ${!ass_array2[@]} 获得数组元数的索引
|
||||
```
|
||||
|
||||
#### 5.数组遍历
|
||||
|
||||
方法一: 通过数组元数的个数进行遍历
|
||||
|
||||
方法二: 通过数组元数的索引进行遍历
|
||||
|
||||
案例一:利用元素进行遍历
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
#定义数组
|
||||
array=(Mon Tue Wed Thur Fir Sat Sun)
|
||||
#数组遍历
|
||||
for day in ${array[*]}
|
||||
do
|
||||
echo $day
|
||||
done
|
||||
```
|
||||
|
||||
案例二:利用索引进行遍历
|
||||
|
||||
```
|
||||
[root@xingdiancloud ~]# cat hello.sh
|
||||
#!/bin/bash
|
||||
for line in `cat /etc/hosts`
|
||||
do
|
||||
hosts[++j]=$line
|
||||
done
|
||||
|
||||
for i in ${!hosts[@]}
|
||||
do
|
||||
echo "$i : ${hosts[i]}"
|
||||
done
|
||||
[root@xingdiancloud ~]# bash hello.sh
|
||||
1 : 127.0.0.1
|
||||
2 : localhost
|
||||
3 : localhost.localdomain
|
||||
4 : localhost4
|
||||
5 : localhost4.localdomain4
|
||||
6 : ::1
|
||||
7 : localhost
|
||||
8 : localhost.localdomain
|
||||
9 : localhost6
|
||||
10 : localhost6.localdomain6
|
||||
```
|
||||
|
||||
定义换行符
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# cat hello.sh
|
||||
#!/bin/bash
|
||||
IFS=$'\n'
|
||||
for line in `cat /etc/hosts`
|
||||
do
|
||||
hosts[++j]=$line
|
||||
done
|
||||
|
||||
for i in ${!hosts[@]}
|
||||
do
|
||||
echo "$i : ${hosts[i]}"
|
||||
done
|
||||
[root@xingdiancloud ~]# bash hello.sh
|
||||
1 : 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
|
||||
2 : ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
|
||||
```
|
||||
|
||||
#### 6.项目案例
|
||||
|
||||
通过数组统计性别:把要统计的对象作为数组的索引
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# cat sex.txt
|
||||
zhangsan f
|
||||
lisi m
|
||||
|
||||
[root@xingdiancloud ~]# cat sex.sh
|
||||
#!/usr/bin/bash
|
||||
declare -A sex
|
||||
while read line
|
||||
do
|
||||
type=`echo $line | awk '{print $2}'`
|
||||
let sex[$type]++
|
||||
done < sex.txt
|
||||
#m作为数组的索引
|
||||
|
||||
for i in ${!sex[@]}
|
||||
do
|
||||
echo "$i : ${sex[$i]}"
|
||||
done
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
<h1><center>shell正则</center></h1>
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 一:正则
|
||||
|
||||
#### 1.正则介绍
|
||||
|
||||
正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符
|
||||
|
||||
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式
|
||||
|
||||
它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念
|
||||
|
||||
重要的文本处理工具:vim、sed、awk、grep
|
||||
|
||||
重要的应用软件:mysql、oracle、php、python、Apache、Nginx ...
|
||||
|
||||
案例:
|
||||
|
||||
```shell
|
||||
匹配数字: ^[0-9]+$ 123 456 +表示前面的内容出现多次
|
||||
匹配Mail: [a-z0-9_]+@[a-z0-9]+\.[a-z]+ xingdian131420@126.com
|
||||
匹配IP: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} {1,3}数字出现1-3次
|
||||
[root@xingdian ~]# egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-eth0
|
||||
IPADDR=172.16.100.1
|
||||
NETMASK=255.255.255.0
|
||||
GATEWAY=172.16.100.25
|
||||
```
|
||||
|
||||
#### 2.元字符
|
||||
|
||||
元字符是这样一类字符,它们表达的是不同于字面本身的含义
|
||||
|
||||
shell元字符(也称为通配符)
|
||||
|
||||
正则表达式元字符
|
||||
|
||||
案例:
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# rm -rf *.pdf
|
||||
|
||||
[root@xingdian ~]# grep 'abc*' /etc/passwd
|
||||
abrt:x:173:173::/etc/abrt:/sbin/nologin
|
||||
```
|
||||
|
||||
#### 3.正则表达式元字符
|
||||
|
||||
基本正则表达式元字符:
|
||||
|
||||
```shell
|
||||
元字符 功能 示例
|
||||
^ 行首定位符 ^love
|
||||
$ 行尾定位符 love$
|
||||
. 匹配单个字符 l..e
|
||||
* 匹配前导符0到多次 ab*love
|
||||
.* 任意多个字符
|
||||
[] 匹配指定范围内的一个字符 [lL]ove
|
||||
[ - ] 匹配指定范围内的一个字符 [a-z0-9]ove
|
||||
[^] 匹配不在指定组内的字符 [^a-z0-9]ove
|
||||
\ 用来转义元字符 love\.
|
||||
\< 词首定位符 \<love
|
||||
\> 词尾定位符 love\>
|
||||
\(..\) 匹配稍后使用的字符的标签 :% s/172.16.130.1/172.16.130.5/
|
||||
:% s/\(172.16.130.\)1/\15/
|
||||
:% s/\(172.\)\(16.\)\(130.\)1/\1\2\35/
|
||||
:3,9 s/\(.*\)/#\1/
|
||||
|
||||
x\{m\} 字符x重复出现m次 o\{5\}
|
||||
x\{m,\} 字符x重复出现m次以上 o\{5,\}
|
||||
x\{m,n\} 字符x重复出现m到n次 o\{5,10\}
|
||||
```
|
||||
|
||||
扩展正则表达式元字符:
|
||||
|
||||
```shell
|
||||
+ 匹配一个或多个前导字符 [a-z]+ove
|
||||
? 匹配零个或一个前导字符 lo?ve
|
||||
a|b 匹配a或b love|hate
|
||||
() 组字符 loveable|rs love(able|rs) ov+ (ov)+
|
||||
(..)(..)\1\2 标签匹配字符 (love)able\1er
|
||||
x{m} 字符x重复m次 o{5}
|
||||
x{m,} 字符x重复至少m次 o{5,}
|
||||
x{m,n} 字符x重复m到n次 o{5,10}
|
||||
```
|
||||
|
||||
#### 4.正则匹配示例
|
||||
|
||||
```shell
|
||||
/love/
|
||||
/^love/
|
||||
/love$/
|
||||
/l.ve/
|
||||
/lo*ve/
|
||||
/[Ll]ove/
|
||||
/love[a-z]/
|
||||
/love[^a-zA-Z0-9]/
|
||||
|
||||
/.*/
|
||||
/^$/
|
||||
/^[A-Z]..$/
|
||||
/^[A-Z][a-z ]*3[0-5]/
|
||||
/[a-z]*\./
|
||||
/^[A-Z][a-z][a-z]$/
|
||||
/^[A-Za-z]*[^,][A-Za-z]*$/
|
||||
/\<fourth\>/
|
||||
/\<f.*th\>/
|
||||
/5{2}2{3}\./
|
||||
5{2}
|
||||
空行
|
||||
/^$/
|
||||
```
|
||||
|
||||
#### 5.正则案例
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
read -p "please input number:" num
|
||||
if [[ ! "$num" =~ ^[0-9]+$ ]]
|
||||
then
|
||||
echo "error number!"
|
||||
else
|
||||
echo "is number!"
|
||||
fi
|
||||
```
|
||||
|
|
@ -0,0 +1,271 @@
|
|||
<h1><center>初始Shell</center></h1>
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 一:Shell概述
|
||||
|
||||
#### 1.计算机编程语言
|
||||
|
||||
计算机编程语言是程序设计的最重要的工具,它是指计算机能够接受和处理的、具有一定语法规则的语言
|
||||
|
||||
阶段:
|
||||
|
||||
机器语言
|
||||
|
||||
机器语言是用二进制代码表示的、计算机能直接识别和执行的一种机器指令的集合,第一代计算机语言
|
||||
|
||||
汇编语言
|
||||
|
||||
用与代码指令实际含义相近的英文缩写词、字母和数字等符号来取代指令代码
|
||||
|
||||
高级语言
|
||||
|
||||
自然语言相近并为计算机所接受和执行的计算机语言称高级语言;独立于机器面向过程或对象的语言
|
||||
|
||||
编译型和解释型语言:
|
||||
|
||||
解释型
|
||||
|
||||
解释性语言编写的程序不进行预先编译,以文本方式存储程序代码
|
||||
|
||||
执行时才翻译执行
|
||||
|
||||
程序每执行一次就要翻译一遍
|
||||
|
||||
代表语言:python,JavaScript,Shell等
|
||||
|
||||
优缺点:跨平台能力强,易于调,执行速度慢
|
||||
|
||||
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230405123821400.png" alt="image-20230405123821400" style="zoom:50%;" />
|
||||
|
||||
编译型
|
||||
|
||||
编译型语言在执行之前要先经过编译过程,编译成为一个可执行的机器语言的文件
|
||||
|
||||
因为翻译只做一遍,以后都不需要翻译,所以执行效率高
|
||||
|
||||
典型代表:C语言,C++
|
||||
|
||||
优缺点:执行效率高,缺点是跨平台能力弱,不便调试
|
||||
|
||||
#### 2.shell能做什么
|
||||
|
||||
自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
|
||||
|
||||
自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
|
||||
|
||||
应用管理程序(KVM,集群管理扩容,MySQL,DELLR720批量RAID)
|
||||
|
||||
日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
|
||||
|
||||
自动化备份恢复程序(MySQL完全备份/增量 + Crond)
|
||||
|
||||
自动化管理程序(批量远程修改密码,软件升级,配置更新)
|
||||
|
||||
自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
|
||||
|
||||
配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
|
||||
|
||||
自动化扩容(增加云主机——>业务上线)
|
||||
|
||||
Shell可以做任何事(一切取决于业务需求)
|
||||
|
||||
#### 3.shell定义
|
||||
|
||||
Shell 是命令解释器,用于与操作系统交互,用来完成各种任务,如文件操作、系统管理、网络管理等
|
||||
|
||||
Shell 是一种程序设计语言,他有变量,有自己的语法结构等,shell程序设计语言可以编写功能很强、代码简短的程序
|
||||
|
||||
#### 4.获取当前支持的Shell
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# cat /etc/shells
|
||||
/bin/sh
|
||||
/bin/bash
|
||||
/usr/bin/sh
|
||||
/usr/bin/bash
|
||||
/bin/tcsh
|
||||
/bin/csh
|
||||
[root@xingdiancloud ~]# chsh -l
|
||||
/bin/sh
|
||||
/bin/bash
|
||||
/usr/bin/sh
|
||||
/usr/bin/bash
|
||||
/bin/tcsh
|
||||
/bin/csh
|
||||
```
|
||||
|
||||
strem9:
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# cat /etc/shells
|
||||
/bin/sh
|
||||
/bin/bash
|
||||
/usr/bin/sh
|
||||
/usr/bin/bash
|
||||
```
|
||||
|
||||
## 二.GUN Bash特性
|
||||
|
||||
#### 1.命令和文件自动补齐
|
||||
|
||||
下载bash-completion 补全工具
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# yum install bash-completion -y
|
||||
```
|
||||
|
||||
#### 2.命令历史记忆功能
|
||||
|
||||
上下键调用历史命令
|
||||
|
||||
获取历史命令的命令:history
|
||||
|
||||
获取某一条历史命令:!number 直接执行对应序号的命令
|
||||
|
||||
快捷键调用历史命令:Ctrl+r 输入关键字调出之前的命令
|
||||
|
||||
#### 3.快捷键
|
||||
|
||||
Ctrl+a 切换到命令行开始
|
||||
|
||||
Ctrl+e 切换到命令行末尾
|
||||
|
||||
Ctrl+u 清除剪切光标之前的内容
|
||||
|
||||
Ctrl+k 清除剪切光标之后的内容
|
||||
|
||||
Ctrl+y 粘贴刚才锁删除的字符
|
||||
|
||||
Ctrl+左右键 快速移动光标
|
||||
|
||||
#### 4.前后台作业控制
|
||||
|
||||
&:后台运行
|
||||
|
||||
nohup:正在运行一个进程,退出帐户时该进程不会结束
|
||||
|
||||
^C:终止
|
||||
|
||||
^Z:暂停
|
||||
|
||||
jobs:查看后台进行
|
||||
|
||||
bg %工作号:将一个在后台暂停的命令,变成继续执行
|
||||
|
||||
fg %工作号:将后台中的命令调至前台继续运行
|
||||
|
||||
案例:
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# sleep 1000 &
|
||||
[1] 7761
|
||||
[root@xingdiancloud ~]# jobs
|
||||
[1]+ Running sleep 1000 &
|
||||
[root@xingdiancloud ~]# jobs
|
||||
[1]+ Running sleep 1000 &
|
||||
[root@xingdiancloud ~]# kill -19 %1
|
||||
|
||||
[1]+ Stopped sleep 1000
|
||||
[root@xingdiancloud ~]# jobs
|
||||
[1]+ Stopped sleep 1000
|
||||
[root@xingdiancloud ~]# bg %1
|
||||
[1]+ sleep 1000 &
|
||||
```
|
||||
|
||||
#### 5.输入输出重定向
|
||||
|
||||
```shell
|
||||
0,1,2 > >> 2> 2>> 2>&1 &> cat < /etc/hosts cat <<EOF
|
||||
```
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# ll /dev/std*
|
||||
lrwxrwxrwx 1 root root 15 Sep 1 2015 /dev/stderr -> /proc/self/fd/2
|
||||
lrwxrwxrwx 1 root root 15 Sep 1 2015 /dev/stdin -> /proc/self/fd/0
|
||||
lrwxrwxrwx 1 root root 15 Sep 1 2015 /dev/stdout -> /proc/self/fd/1
|
||||
```
|
||||
|
||||
#### 6.管道
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# ip addr |grep 'inet ' |grep eth0
|
||||
[root@xingdiancloud ~]# ip addr |grep 'inet ' |tee test |grep eth0 覆盖
|
||||
[root@xingdiancloud ~]# ip addr |grep 'inet ' |tee -a test |grep eth0 -a 追加
|
||||
```
|
||||
|
||||
#### 7.命令排序
|
||||
|
||||
; 无论前面是否执行成功,分号后的命令都会继续执行
|
||||
|
||||
&& 前面执行成功,后面的才继续执行
|
||||
|
||||
|| 前面命令不成功,后面的命令也会继续
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# ./configure && make && make install (命令返回值 echo $?)
|
||||
[root@xingdiancloud ~]# mkdir /var/111/222/333 && echo ok
|
||||
[root@xingdiancloud ~]# mkdir -p /var/111/222/333 && echo ok
|
||||
[root@xingdiancloud ~]# ls /home/111/222/333/444 || mkdir -p /home/111/222/333/444
|
||||
```
|
||||
|
||||
#### 8.shell通配符
|
||||
|
||||
* 匹配任意多个字符 ls in*
|
||||
|
||||
? 匹配任意一个字符 ll l?ve
|
||||
|
||||
[] 匹配括号中任意一个字符 [a-z]
|
||||
|
||||
() 在子shell中执行 (umask 077; touch file1000)
|
||||
|
||||
{} 集合 touch file{1..9}
|
||||
|
||||
\ 转义符,让元字符回归本意
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# echo *
|
||||
[root@xingdiancloud ~]# echo \*
|
||||
[root@xingdiancloud ~]# touch xing\ dian
|
||||
```
|
||||
|
||||
## 三:编写脚本
|
||||
|
||||
创建bash脚本: 以.sh结尾的文件 .py结尾的文件是python的脚本
|
||||
|
||||
#### 1.创建脚本文件
|
||||
|
||||
```shell
|
||||
#!/bin/bash #!/usr/bin/env bash
|
||||
指定命令解释器:第一行的专门解释命令解释器
|
||||
注释 :以#开有的都不生效
|
||||
编写bash指令集合
|
||||
```
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
#注释
|
||||
#author:blackmed
|
||||
#version:0.1
|
||||
#功能
|
||||
```
|
||||
|
||||
#### 2.修改权限
|
||||
|
||||
注意:改不改权限都可以执行
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]#./scripts
|
||||
[root@xingdiancloud ~]#/shelldoc/scripts
|
||||
[root@xingdiancloud ~]#bash scripts
|
||||
```
|
||||
|
||||
## 四:脚本调试
|
||||
|
||||
sh –x script 这将执行该脚本并显示所有变量的值
|
||||
|
||||
sh –n script 不执行脚本只是检查语法模式,将返回所有错误语法
|
||||
|
||||
sh –v script 执行脚本前把脚本内容显示在屏幕上
|
|
@ -0,0 +1,550 @@
|
|||
<h1><center>流程控制</center></h1>
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
## 一:条件测试
|
||||
|
||||
#### 1.语法格式
|
||||
|
||||
```shell
|
||||
格式1: test 条件表达式
|
||||
格式2: [ 条件表达式 ]
|
||||
格式3: [[ 条件表达式 ]]
|
||||
```
|
||||
|
||||
#### 2.文件测试
|
||||
|
||||
```shell
|
||||
[ -e dir|file ]
|
||||
[ -d dir ]
|
||||
[ -f file ] 是否存在,而且是文件
|
||||
[ -r file ] 当前用户对该文件是否有读权限
|
||||
[ -x file ]
|
||||
[ -w file ]
|
||||
```
|
||||
|
||||
案例
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# test -d /home
|
||||
[root@xingdian ~]# echo $?
|
||||
0
|
||||
[root@xingdian ~]# test -d /home11111
|
||||
[root@xingdian ~]# echo $?
|
||||
1
|
||||
[root@xingdian ~]# [ -d /home ]
|
||||
[root@xingdian ~]# [ ! -d /ccc ] && mkdir /ccc
|
||||
[root@xingdian ~]# [ -d /ccc ] || mkdir /ccc
|
||||
```
|
||||
|
||||
#### 3.数值比较
|
||||
|
||||
```shell
|
||||
[ 1 -gt 10 ] 大于
|
||||
[ 1 -lt 10 ] 小于
|
||||
[ 1 -eq 10 ] 等于
|
||||
[ 1 -ne 10 ] 不等于
|
||||
[ 1 -ge 10 ] 大于等于
|
||||
[ 1 -le 10 ] 小于等于
|
||||
```
|
||||
|
||||
案例
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# disk_use=$(df -P |grep '/$' |awk '{print $5}' |awk -F% '{print $1}')
|
||||
[root@xingdian ~]# [ $disk_use -gt 90 ] && echo "war......"
|
||||
[root@xingdian ~]# [ $disk_use -gt 60 ] && echo "war......"
|
||||
```
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户"
|
||||
当前是超级用户
|
||||
[alice@xingdian ~]$ [ $UID -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
|
||||
you不是超级用户
|
||||
```
|
||||
|
||||
#### 4.字符串比较
|
||||
|
||||
```shell
|
||||
提示:使用双引号
|
||||
[root@xingdian ~]# [ "$USER" = "root" ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ "$USER" == "root" ];echo $?
|
||||
0
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
```shell
|
||||
"":弱引用,可以实现变量和命令的替换
|
||||
[root@xingdian ~]# x=*
|
||||
[root@xingdian ~]# echo "$x"
|
||||
*
|
||||
'':强引用,不完成变量替换
|
||||
[root@xingdian ~]# x=*
|
||||
[root@xingdian ~]# echo '$x'
|
||||
$x
|
||||
```
|
||||
|
||||
#### 5.扩展
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# var1=111
|
||||
[root@xingdian ~]# var2=
|
||||
[root@xingdian ~]# //var3变量没有定义
|
||||
[root@xingdian ~]# echo ${#var1} #显示变量中字符串的个数
|
||||
3
|
||||
[root@xingdian ~]# echo ${#var2}
|
||||
0
|
||||
[root@xingdian ~]# echo ${#var3}
|
||||
0
|
||||
[root@xingdian ~]# [ -z "$var1" ];echo $? //-z 变量字符串为空
|
||||
1
|
||||
[root@xingdian ~]# [ -z "$var2" ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ -z "$var3" ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ -n "$var1" ];echo $? //-n 变量字符串不为空
|
||||
0
|
||||
[root@xingdian ~]# [ -n "$var2" ];echo $?
|
||||
1
|
||||
[root@xingdian ~]# [ -n "$var3" ];echo $?
|
||||
1
|
||||
```
|
||||
|
||||
案例:
|
||||
|
||||
```shell
|
||||
[root@xingdian ~]# [ "$USER" = "root" ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ "$USER" = "alice" ];echo $?
|
||||
1
|
||||
[root@xingdian ~]# [ "$USER" != "alice" ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ 1 -lt 2 -a 5 -gt 10 ];echo $?
|
||||
1
|
||||
[root@xingdian ~]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $?
|
||||
1
|
||||
[root@xingdian ~]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
|
||||
0
|
||||
[root@xingdian ~]# [ "$USER" = "root" ];echo $?
|
||||
0
|
||||
```
|
||||
|
||||
## 二:条件判断
|
||||
|
||||
#### 1.流程控制
|
||||
|
||||
在一个shell脚本中的命令执行顺序称作脚本的流;大多数脚本会根据一个或多个条件来改变它们的流
|
||||
|
||||
流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令
|
||||
|
||||
exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出
|
||||
|
||||
条件判断:if代码返回0表示真,非0为假
|
||||
|
||||
#### 2.语法结构
|
||||
|
||||
单分支结构
|
||||
|
||||
```shell
|
||||
if 条件测试
|
||||
then 命令序列
|
||||
fi
|
||||
```
|
||||
|
||||
双分支结构
|
||||
|
||||
```shell
|
||||
if 条件测试
|
||||
then 命令序列
|
||||
else 命令序列
|
||||
fi
|
||||
```
|
||||
|
||||
多分支结构
|
||||
|
||||
```shell
|
||||
if 条件测试1
|
||||
then 命令序列
|
||||
|
||||
[elif 条件测试2
|
||||
then 命令序列
|
||||
|
||||
elif 条件测试3
|
||||
then 命令序列]...
|
||||
|
||||
else 命令序列
|
||||
fi
|
||||
```
|
||||
|
||||
案例
|
||||
|
||||
```shell
|
||||
if [ "$USER" = "root" ]
|
||||
then
|
||||
if [ $UID -eq 0 ]
|
||||
then
|
||||
echo "the user is root"
|
||||
fi
|
||||
|
||||
elif
|
||||
echo "……"
|
||||
elif
|
||||
echo "……"
|
||||
else
|
||||
echo "the user is not root"
|
||||
echo "正在给用户授权"
|
||||
|
||||
fi
|
||||
```
|
||||
|
||||
## 三:循环结构
|
||||
|
||||
#### 1.for循环
|
||||
|
||||
##### 语法结构
|
||||
|
||||
```shell
|
||||
for i in (取值) 范围{1..20} zhangsan lisi wanger mazi ${array[*]}
|
||||
for 变量名 [ in 取值列表 ]
|
||||
do
|
||||
循环体
|
||||
done
|
||||
```
|
||||
|
||||
##### 案例一
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
# ping主机测试
|
||||
for i in {70..100}
|
||||
do
|
||||
ping -c1 10.30.161.$i &> /dev/null
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo "10.30.161.$i is up" |tee -a ipup.txt
|
||||
else
|
||||
echo "10.30.161.$i is down" |tee -a ipdown.txt
|
||||
fi
|
||||
|
||||
done
|
||||
```
|
||||
|
||||
##### 案例二
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
#批量添加账户
|
||||
for i in {30..40}
|
||||
do
|
||||
useradd user$i && echo "123" | passwd --stdin user$i &>/dev/null
|
||||
if [ $? -eq 0 ];then
|
||||
echo "账户 user$i 添加成功"
|
||||
else
|
||||
echo "账户 user$i 添加失败"
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
##### 案例三
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
#批量删除账户
|
||||
for i in {20..30}
|
||||
do
|
||||
userdel -r user$i &>/dev/null
|
||||
[ $? -eq 0 ] && echo "账户 user$i 删除成功" || echo "账户 user$i 删除失败"
|
||||
done
|
||||
```
|
||||
|
||||
#### 2.while循环
|
||||
|
||||
不断重复的执行循环体中的语句,直到某个条件成立
|
||||
|
||||
循环次数不一定是固定的
|
||||
|
||||
##### 语法结构
|
||||
|
||||
当条件测试成立(条件测试为真),执行循环体
|
||||
|
||||
```
|
||||
while 条件测试
|
||||
do
|
||||
循环体
|
||||
done
|
||||
```
|
||||
|
||||
##### 案例
|
||||
|
||||
```shell
|
||||
echo "please enter a number between 5 and 10 :"
|
||||
read var
|
||||
while [[ $var != 0 ]]
|
||||
do
|
||||
|
||||
if [ "$var" -lt 5 ]
|
||||
then
|
||||
echo "Too smail , Try again"
|
||||
read var
|
||||
elif [ "$var" -gt 10 ]
|
||||
then
|
||||
echo "Too big , Try again"
|
||||
read var
|
||||
else
|
||||
echo "Congratulation! You are right."
|
||||
exit 0;
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
#### 3.until循环
|
||||
|
||||
当条件测试成立(条件测试为假),执行循环体
|
||||
|
||||
##### 语法结构
|
||||
|
||||
```shell
|
||||
until 条件测试
|
||||
do
|
||||
循环体
|
||||
done
|
||||
```
|
||||
|
||||
##### 案例
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
i=1
|
||||
until [ "$i" -eq 21 ]
|
||||
do
|
||||
userdel -r user$i
|
||||
let i++
|
||||
done
|
||||
```
|
||||
|
||||
## 四:匹配模式
|
||||
|
||||
#### 1.语法模式
|
||||
|
||||
```shell
|
||||
read -p "请输入你的选项:" num
|
||||
case num in
|
||||
1) 选项
|
||||
命令序列1 命令/if语句/for循环……
|
||||
;;
|
||||
模式2)
|
||||
命令序列2
|
||||
;;
|
||||
模式3)
|
||||
命令序列3
|
||||
;;
|
||||
*)
|
||||
无匹配后命令序列
|
||||
esac
|
||||
```
|
||||
|
||||
##### 案例一
|
||||
|
||||
确定要继续删除吗 yes/no: " yes
|
||||
|
||||
##### 案例二
|
||||
|
||||
系统管理工具箱
|
||||
|
||||
```shell
|
||||
Command action
|
||||
h 显示命令帮助
|
||||
f 显示磁盘分区
|
||||
d 显示磁盘挂载
|
||||
m 查看内存使用
|
||||
u 查看系统负载
|
||||
q 退出程序
|
||||
Command (h for help): m
|
||||
total used free shared buffers cached
|
||||
Mem: 7628 840 6788 0 29 378
|
||||
Swap: 2047 0 2047
|
||||
```
|
||||
|
||||
#### 2.工具箱
|
||||
|
||||
```shell
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cat <<-EOF
|
||||
+-------------------------------------------------------------------------+
|
||||
| System_tools V1.0 |
|
||||
+-------------------------------------------------------------------------+
|
||||
| a. Stop And Disabled Firewalld. |
|
||||
| b. Disabled SELinux Secure System. |
|
||||
| c. Install Apache Service. |
|
||||
| d. Quit |
|
||||
+-------------------------------------------------------------------------+
|
||||
EOF
|
||||
printf "\e[1;31m Please input your select: \e[0m" && read var
|
||||
|
||||
case "$var" in
|
||||
"a")
|
||||
systemctl stop firewalld && systemctl disable firewalld
|
||||
;;
|
||||
"b")
|
||||
sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
|
||||
;;
|
||||
"c")
|
||||
yum -y install httpd httpd-tools
|
||||
;;
|
||||
"d")
|
||||
exit
|
||||
;;
|
||||
*)
|
||||
printf "请按照上方提供的选项输入!!!\n"
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
## 五:循环控制
|
||||
|
||||
#### 1.break
|
||||
|
||||
关键字用于跳出循环,执行循环后面的语句
|
||||
|
||||
案例
|
||||
|
||||
```shell
|
||||
for i in {1..10}
|
||||
do
|
||||
if [ $i -eq 5 ]
|
||||
then
|
||||
break
|
||||
fi
|
||||
echo $i
|
||||
done
|
||||
# 输出结果为:
|
||||
# 1
|
||||
# 2
|
||||
# 3
|
||||
# 4
|
||||
```
|
||||
|
||||
#### 2.continue
|
||||
|
||||
跳过当前循环中的剩余语句,直接进入下一次循环
|
||||
|
||||
案例
|
||||
|
||||
```shell
|
||||
for i in {1..10}
|
||||
do
|
||||
if [ $i -eq 5 ]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
echo $i
|
||||
done
|
||||
# 输出结果为:
|
||||
# 1
|
||||
# 2
|
||||
# 3
|
||||
# 4
|
||||
# 6
|
||||
# 7
|
||||
# 8
|
||||
# 9
|
||||
# 10
|
||||
```
|
||||
|
||||
#### 3.sleep
|
||||
|
||||
sleep 10 等待10秒,再继续下一操作
|
||||
|
||||
## 六:格式化打印
|
||||
|
||||
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等
|
||||
|
||||
#### 1.语法格式
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# printf format-string [arguments...]
|
||||
• format-string: 为格式控制字符串
|
||||
• arguments: 为参数列表
|
||||
```
|
||||
|
||||
```shell
|
||||
[root@xingdiancloud ~]# echo "Hello, Shell"
|
||||
Hello, Shell
|
||||
|
||||
[root@xingdiancloud ~]# printf "Hello, Shell"
|
||||
|
||||
[root@xingdiancloud ~]# printf "Hello, Shell\n"
|
||||
Hello, Shell
|
||||
```
|
||||
|
||||
#### 2.案例
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
|
||||
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234
|
||||
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
|
||||
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
|
||||
```
|
||||
|
||||
#### 3.参数解释
|
||||
|
||||
%s 字符串
|
||||
|
||||
%f 小数
|
||||
|
||||
%d 数字
|
||||
|
||||
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐)
|
||||
|
||||
%-4.2f 指格式化为小数,其中.2指保留2位小数
|
||||
|
||||
\f 换页
|
||||
|
||||
\n 换行
|
||||
|
||||
\r 回车
|
||||
|
||||
## 七:颜色
|
||||
|
||||
shell脚本中echo显示内容带颜色显示,需要使用到-e参数
|
||||
|
||||
#### 1.语法格式
|
||||
|
||||
```shell
|
||||
格式1:echo -e "\033[背景颜色;字体颜色m 要输出的字符 \033[0m"
|
||||
格式2:echo -e "\e[背景颜色;字体颜色m 要输出的字符 \e[0m"
|
||||
```
|
||||
|
||||
#### 2.案例
|
||||
|
||||
```shell
|
||||
echo -e “\033[30m 黑色字 \033[0m”
|
||||
echo -e “\033[31m 红色字 \033[0m”
|
||||
echo -e “\033[32m 绿色字 \033[0m”
|
||||
echo -e “\033[33m 黄色字 \033[0m”
|
||||
echo -e “\033[34m 蓝色字 \033[0m”
|
||||
echo -e “\033[35m 紫色字 \033[0m”
|
||||
echo -e “\033[36m 天蓝字 \033[0m”
|
||||
echo -e “\033[37m 白色字 \033[0m”
|
||||
echo -e “\033[40;37m 黑底白字 \033[0m”
|
||||
echo -e “\033[41;37m 红底白字 \033[0m”
|
||||
echo -e “\033[42;37m 绿底白字 \033[0m”
|
||||
echo -e “\033[43;37m 黄底白字 \033[0m”
|
||||
echo -e “\033[44;37m 蓝底白字 \033[0m”
|
||||
echo -e “\033[45;37m 紫底白字 \033[0m”
|
||||
echo -e “\033[46;37m 天蓝底白字 \033[0m”
|
||||
echo -e “\033[47;30m 白底黑字 \033[0m”
|
||||
|
||||
控制选项:
|
||||
\033[0m:关闭所有属性
|
||||
\033[1m:高亮显示,加粗
|
||||
\033[5m:闪烁
|
||||
```
|
Loading…
Reference in New Issue