代码规范
1、#!/bin/bash
//脚本第一行, #!魔法字符,指定脚本代码执行的程序。即它告诉系统这个脚本需要什么解释器来执行,也就是使用
哪一种Shell
2、#代表注释,#!特例
3、//以下内容是对脚本的基本信息的描述,大家可以根据实际情况尽可能的写详细一些,方便后续使用者
# Name: 脚本名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
# Author:作者
# Release: 分发版本
//下面就是脚本的具体内容
commands
...
变量
定义:VAR1=1
使用变量:$VAR1
取消变量:unset VAR1
有类型变量: declare
-i 将变量看成整数
-r 使变量只读 readonly,该变量的值无法改变,并且不能为unset
-x 标记变量通过环境导出 export
-a 指定为索引数组(普通数组);查看普通数组
-A 指定为关联数组;查看关联数组
环境变量(export):定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。
全局变量(export):在/etc/profile /etc/bashrc下永久定义
内置变量
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录
$$:当前所在进程的进程号 echo $$
$!:后台运行的最后一个进程号 (当前终端)
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出
ECHO
OPTIONS:
-n 不要在最后自动换行
-e 转义必须加
转义字符
\a 发出警告声;
\b 删除前一个字符;
\t 插入tab;
\n 换行且光标移至行首;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\r 光标移至行首,但不换行;
echo -e "\033[字背景颜色;文字颜色m 字符串\033[0m"
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
字颜色:30—–37
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”
字背景颜色范围:40—–47
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[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \33[37m
设置前景色
\033[40m — \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\33[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
READ
-p 打印信息
-t 限定时间
-s 不回显
-n 输入字符个数
read -s -t30 -p "Password: " pw //交互输入密码
算术运算
整形运算
– expr
expr 5 \* 2
– let
let a=100-3;echo $a
– $(())
echo $(( 100*3))
– bc
echo "scale=2;100/3"|bc
比较运算
精确比较
-eq 等于 equal
-gt 大于
-lt 小于
模糊比较
-ge 大于或等于
-le 小于或等于
-ne 不等于
逻辑运算符
- 逻辑与运算 &&
- 逻辑或运算 ||
- 逻辑非运算 !
数组
- 一次附一个值
变量名=变量值
array[0]=v1
array[1]=v2
array[3]=v3
- 一次附多个值
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`) //将文件中每一行赋值给array1数组
array2=(`ls /root`)
array3=(harry amy jack "Miss zhang")
array4=(1 2 3 4 "hello world" [10]=linux)
数组取值
${array[i]} i表示元素的索引
使用@ 或 * 可以获取数组中的所有元素:
获取第一个元素
echo ${array[0]}
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引索引
echo ${array[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
定义管理数组
首先声明关联数组
declare -A array1
declare -A array2
declare -A array3
关联数组
- 一次赋一个值
数组名[索引]=变量值 array1[demo]=demo
- 一次附多个值
array2=([name1]="harry" [name2]="jack" )
- 查看关联数组
declare -A
if语句与shell运算
与文件存在与否的判断
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 是否为普通文件
-d 是否为目录
-S socket
-p pipe
-c character
-b block
-L 软link
文件权限相关的判断
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid
-g 是否sgid
-k 是否有t位
两个文件的比较判断
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
字符串之间的判断
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 == string2 是否相等
string1 != string2 不等
多重条件判断
逻辑判断符号:
&& (and 逻辑与) 两个条件同时满足,整个大条件为真
|| (or 逻辑或) 两个条件满足任意一个,整个大条件为真
! 非运算
case语法
case $var in 定义变量;var代表是变量名
pattern 1) 模式1;用 | 分割多个模式,相当于or
command1 需要执行的语句
;; 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) default,不满足以上模式,默认执行*)下面的语句
command4
;;
esac esac表示case语句结束
正则表达式
^ 锚定开头 ^a 以a开头 默认锚定一个字符
$ 锚定结尾 a$ 以a结尾 默认锚定一个字符
匹配符:匹配字符串
. 匹配除回车以外的任意一个字符
( ) 字符串分组
[ ] 定义字符类,匹配括号中的一个字符
[ ^ ] 表示否定括号中出现字符类中的字符,取反。
\ 转义字符
例子:
egrep "^a[a-z0-9]c$" file
egrep "^e\*f$" file
egrep "^a.(b|c)$" file
限定符:对前面的字符或者(字符串)出现的次数做限定说明
* 某个字符之后加星号表示该字符不出现或出现多次 a* (ab)*
? 与星号相似,但略有变化,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次
例子:
egrep "^ab*c$" file
egrep "^ab+c$" file
egrep "^ab{2,4}c$" file
egrep "^ab{3}c$" file
egrep "^ab{1,}c$" file
正则表达式POSIX字符
[:alnum:] 匹配任意字母字符0-9 a-z A-Z
[:alpha:] 匹配任意字母,大写或小写
[:digit:] 数字 0-9
[:graph:] 非空字符( 非空格控制字符)
[:lower:] 小写字符a-z
[:upper:] 大写字符A-Z
[:cntrl:] 控制字符
[:print:] 非空字符( 包括空格)
[:punct:] 标点符号
[:blank:] 空格和TAB字符
[:xdigit:] 16 进制数字
[:space:] 所有空白字符( 新行、空格、制表符)
grep '^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$' --color ip_base
SED
-e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n 抑制自动输出
-i 编辑文件内容
-i.bak 修改时同时创建.bak备份文件。
-r 使用扩展的正则表达式
! 取反 (跟在模式条件后与shell有所区别)
#command 对文件干什么
sed常用内部命令
a 在匹配后面添加
i 在匹配前面添加
d 删除
s 查找替换 字符串
c 更改
y 转换 N D P
p 打印
#flags
数字 表示新文本替换的模式
g: 表示用新文本替换现有文本的全部实例
p: 表示打印原始的内容
w filename: 将替换的结果写入文件
例子:
sed 'a\append data "haha"' data1
sed '2a\append data "haha"' data1 //在第二行后新开一行追加数据
sed '/3 the/a\append data "haha"' data1 //找到包含"3 the"的行,在其后新开一行追加内容
sed '2i\insert data "haha"' data1 //在第二行前新开一行插入数据
sed 's/dog/cat/' data1
sed 'c\change data "haha"' data1 //将data1文件中的所有行的内容更改
sed '3d' data1 //删除文件data1中的第三行数据
sed 'p' data1 //输出到屏幕
sed -e 's/brown/green/;s/dog/cat/' data1
sed '3s/dog/cat/w text' data2
***从文件读取编辑器命令 -f 适用于日常重复执行的场景***
1)将命令写入文件
vim abc
s/brown/green/
s/dog/cat/
s/fox/elephant/
2)使用-f命令选项调用命令文件
sed -f abc data1
1 the quick green elephant jumps over the lazy cat.
2 the quick green elephant jumps over the lazy cat.
AWK
BEGIN:处理数据源之前干什么 不需要数据源就可以执行
PROGRAM: 对数据源干什么 【默认必须有】 需要数据源
END:处理完数据源后干什么 需要program 需要数据源
awk '{print $6}' test //提取第六列
awk -F ':' '{print $1,$3,$NF}' /etc/passwd
awk -f abc test
//将程序写入文件,每次使用-f调用程序文件就好,方便,高效。
awk -v name='hapa' 'BEGIN{print name}'
awk 'NR==3{print $0}' test //打印第三行全部
awk '$1=="3"{print $0}' test //指定行的第一个字段精确匹配字符串为3
awk -F ':' '$1 ~ "^ro" {print $0}' /etc/passwd
awk -F ':' '$1 !~ "^ro" {print $0}' /etc/passwd
awk 环境变量
变量 描述
FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS 输入字段分隔符号 数据源的字段分隔符 -F
OFS 输出字段分隔符号
RS 输入记录分隔符
ORS 输出记录分隔符号
awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$3,$NF}' /etc/passwd
root-0-/bin/bash