一、学习线路如下
二、变量
1.变量的概念
变量(variable)就是给某个信息片段所起的名字。每个变量都有一个值(value),这是由你分配给变量的内容或信息。变量值可以是空值,也就是不含任何字符。
2.变量的命名
SHELL变量名称的开头是一个字母互或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。变量名称的字符长度并无限制。Shell变量可用来保存字符串值,所能保存的字符数同样没有限制。
3.变量的赋值方式
先写变量名称,紧接着'='字符,最后是新值,中间完全没有任何空格。当你想取出Shell变量的值时,需于变量名称前面加上'$'字符。当所赋值的值内含空格时,请加上引号。
4.变量分类
1.本地变量-临时变量
用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失败。
2.环境变量-用户私有变量
定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。
查看当前用户的环境变量env
查看当前用户的所有变量(临时变量与环境变量)set
将当前变量变成环境变量export
3.全局变量
所有用户都能够使用,export声明变量。
也可以在/etc/profile /etc/bashrc下永久定义
4.内置变量
系统变量(内置bash中的变量)shell本身已经固定好了它的名字和作用。
三、文本处理的命令
cut整数截取 语法: command|cut option -c: 以字符为单位进行分割。 -d: 自定义分隔符,默认为制表符。 -f: 与-d一起使用,指定显示哪个区域。 例:cat /etc/passwd|cut -d ":" -f1,7 tr 字符转换:替换,删除 语法: commands|tr 'string1' 'string2' tr 'string1' 'string2' < filename tr options 'string1' < filename -d 删除字符串1中所有输入字符。 -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。 a-z 任意小写 A-Z 任意大写 0-9 任意数字 sort排序 sort:将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输 出。 -u :去除重复行 -r :降序排列,默认是升序 -o : 将排序结果输出到文件中 类似 重定向符号> -n :以数字排序,默认是按字符排序 -t :分隔符 -k :第N列 -b :忽略前导空格。 -R :随机排序,每次运行的结果均不同。 uniq 去除连续的重复行 -i: 忽略大小写 -c: 统计重复行次数 -d:只显示重复行 tee 双向输出 -a 双向追加重定向 例:echo 999|tee -a file1 paste工具用于合并文件行输出到屏幕,不会改动源文件 -d:自定义间隔符,默认是tab,只接受一个字符 -s:将每个文件中的所有内容按照一行输出,文件中的行与行以TAB间隔。 echo输出 语法:echo [-ne][字符串] -n 不要在最后自动换行 -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: 转义字符 a 发出警告声; 删除前一个字符; c 最后不加上换行符号; f 换行但光标仍旧停留在原来的位置; 换行且光标移至行首; 光标移至行首,但不换行; 插入tab; v 与f相同; 插入字符; nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o xNN 打印NN(十六进制)所代表的ASCII字符; 输出字体颜色 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” read默认接受键盘的输入,回车符代表输入结束 OPTIONS: -p打印信息 -t限定时间 -s不回显 -n输入字符个数
四、SHELL字符
!: 执行历史命令 !! 执行上一条命令 $: 变量中取内容符 + - * %: 对应数学运算 加 减 乘 除 取余数 &: 后台执行 ;: 分号可以在shell中一行执行多个命令,命令之间用分号分割 : 转义字符 ``: 反引号 命令中执行命令 echo "today is `date +%F`" ' ': 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不 解释变量 " ": 双引号,脚本中出现的字符串可以用双引号引起来 通配符 ~: 家目录 # cd ~ 代表进入⽤用户家目录 *: 星号是shell中的通配符 匹配所有 ?: 问号是shell中的通配符 匹配除回车以外的一个字符 [list]: 匹配[list]中的任意单个字符 [!list]: 匹配除list中的任意单个字符 {string1,string2,...}: 匹配string1,string2或更多字符串 重定向 > 覆盖输入 >> 追加输入 < 输出 << 追加输出 管道命令 |: 管道符 上一个命令的输出作为下一个命令的输入
五、正则表达式
1.正则的介绍:
正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
2.正则表达式中相应符号的解释
1)定位符 ^ 锚定开头 ^a 以a开头 默认锚定一个字符 $ 锚定结尾 a$ 以a结尾 默认锚定一个字符 <,: 锚定单词首部 >,: 锚定单词尾部 2)匹配符 . 匹配除回车以外的任意一个字符 () 字符串分组 [] 定义字符类,匹配括号中的一个字符 [^] 表示否定括号中出现字符类中的字符,取反 转义字符 | 或 3)限定符 * 某个字符之后加星号表示该字符不出现或出现多次 ? 表示该字符出现一次或不出现 + 表示该字符出现一次或多次 {n,m} 某个字符之后出现,表示该字符最少出现n次,最多m次 {m} 正好出现了m次
3.正则表达式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:] 所有空白字符( 新行、空格、制表符)
六、数组
1.生成数组
数组名称=(元素1 元素2 元素3 ...)
2.追加数组
数组名称[n]=value
3.一次赋多个值
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`)
4.数据取值
${array[i]} i表示元素的索引
使用@ 或 * 可以获取数组中的所有元素:
echo ${array[0]} 获取第一个元素
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引索引
echo ${array[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
5.关联数组
1.声明关联数组
declare -A asso_array1
2.赋值
asso_array1[linux]=one
3.一次赋多个值
asso_array1=([name1]=harry [name2]=jack [name3]=amy
七、if语句判断
1.赋值运算 = 2.四则运算: + - * / % ** 运算命令: expr: 例: expr 1 + 1 let: 例:let a=100/3;echo a $(()) 例:echo $((1+1)) bc 例:echo "scale=2;3+1"|bc 3.逻辑运算 $$ || ! 4.比较运算 -eq 等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 -ne 不等于 字符串比较晕眩 == 等于 != 不等于 -n 检查字符串的长度是否大于0 -z 检查字符串的长度的是否为0 5.文件类型及新旧判断 -d 检查文件是否存在且为目录 -e 检查文件是否存在 -f 检查文件是否存在且为文件 -r 检查文件是否存在且可读 -s 检查文件是否存在且不为空 -w 检查文件是否存在且可写 -x 检查文件是否存在且可执行 -O 检查文件是否存在并且被当前用户拥有 -G 检查文件是否存在并且默认组为当前用户组 file1 -nt file2 检查file1是否比file2新 file1 -ot file2 检查file1是否比file2旧 file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点 6.多重条件判断 -a 和&& 同真为真 -o 和|| 任意满足一个则为真 6.if高级用法 if (()) 可植入数学表达式 if [[]] 可在条件中使用通配符
八、循环语句
1.for循环的格式 for i in {1..10} for i in 1 2 3 4 for i in `seq 10` for ((expr1;expr2;expr3)) do command done 2.while循环的格式 while [ 表达式 ] do command... done 注:":" or "True" 代表真 3.case语句格式 case $var in #定义变量;var代表是变量名 pattern 1) #模式1;用 | 分割多个模式,相当于or command1 #需要执行的语句 ;; #两个分号代表命令结束 pattern 2) command2 ;; *) #default,不满足以上模式,默认执行*)下面的语句 command4 ;; esac #esac表示case语句结束 4.until语句 与while语法一致,until循环当条件为假时执行 5.循环控制 break 马上停止执行本次循环,执行循环体后面的代码 continue 循环体内的下面代码不执行,重新开始下一次循环 sleep 控制循环 shift 位置参数像左移,默认移动一位 exit 脚本退出命令
九、SHELL函数
1.shell函数的介绍
shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。
将完成一个功能的一段代码进行命名、封装
函数的优点:
1. 代码模块化,调用方便,节省内存
2. 代码模块化,代码量少,排错简单
3. 代码模块化,可以改变代码的执行顺序
2.函数定义
语法一:
函数名 () {
代码块
return N
}
语法二:
function 函数名 {
代码块
return N
}
调用函数时直接输入函数名即可
十、文本处理之grep
grep: 负责从数据源中检索对应的字符串,行过滤。
grep用于根据关键字进行行过滤
grep options 'keys' filename
OPTIONS:
-i: 不区分大小写
-v: 查找不包含指定内容的行,反向选择
-w: 按单词搜索
-n: 显示行号
-A: 显示匹配行及后面多少行
-B: 显示匹配行及前面多少行
-o: 打印匹配关键字
-c: 统计匹配到的次数
-r: 逐层遍历目录查找
-C: 显示匹配行前后多少行
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e: 使用正则匹配
-E:使用扩展正则匹配
^key:以关键字开头
key$:以关键字结尾
^$:匹配空行
--color=auto :可以将找到的关键词部分加上颜色的显示
十一、文本处理之sed
1.sed介绍 sed是Linux中提供的一个外部命令,它是一个行(流)编辑器,编辑对象是文件中的行。 2.sed语法 sed [options]'{command}{flags}' [filename] 命令选项: -e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作 -f script 将文件中指定的命令添加到处理输入时执行的命令中 -n 抑制自动输出 -i 编辑文件内容 -i.bak 修改时同时创建.bak备份文件。 -r 使用扩展的正则表达式 ! 取反 (跟在模式条件后与shell有所区别) sed常用内部命令 曾:a(在匹配后面添加) i(在匹配前面添加) 删:d 改:s(替换查找字符串) c(更改行)y(转换) 查:p(打印) flags 数字: 表示新文本替换的模式 g: 表示用新文本替换现有文本的全部实例 p: 表示打印原始的内容 w filename: 将替换的结果写入文件
十二、文本处理之awk
1.awk介绍: awk是一种可以处理数据、产生格式化报表的语言。awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格活tab制表符 awk的工作方式是读取数据,将每一行数据视为一条记录(record),每条记录以字段分隔符分为若干字段,然后输出各字段的值。 2.awk语法 awk [options] [BEGIN] {program} [END] [filename] 常用命令选项: -F fs 指定描绘一行中数据字段的文件分隔符,默认空格 -f file 指定读取程序的文件名 -v val=value 定义awk程序中使用的变量和默认值 awk程序运行优先级是: 1)BEGIN:在开始处理数据流之间执行 2)program:如何处理数据流,必选项 3)END:处理完数据流后执行,可选项 3.awk基本应用 1)对字段(列)进行截取 awk -F: '{print $1,$NF}' /etc/passwd root /bin/bash 2)对记录(行)的提取 指定行号: awk -F: 'NR==1{print $1,$NF};NR==3{print $1,$NF}' /etc/passwd root /bin/bash daemon /sbin/nologin 注:NR:指定行号 精确匹配 awk -F: '$1=="user20"{print $1,$NF}' /etc/passwd user20 /bin/bash 模糊匹配 awk -F: '$1 ~ "^user20"{print $1,$NF}' /etc/passwd user20 /bin/bash 3)定义变量和数组 定义变量: awk -v name='jiangfeng' 'BEGIN{print name}' jiangfeng 定义数组 awk 'BEGIN{ array[0]="jiang";array[10]="feng";print array[0]}' jiang 4)awk运算 1.赋值运算= 2.比较运算>= == < <= != 如果比较的是字符串则按ascii编码顺序表比较。如果结果返回为真则用1表示,如果返回为假则用0表示 awk 'BEGIN{print "ca" >= "ba"}' 1 注:不能用">",意义为重定向 3.数学运算 + - * / % ** ++ -- [root@server88 ~]# awk 'BEGIN{print 2**100}' 1267650600228229401496703205376 [root@server88 ~]# awk -v 'num=1' 'BEGIN{num++;print num}' 2 4.逻辑运算 && || awk -v 'val=a' 'BEGIN{print "ca" >= "ba" ||"a"==val}' 1 5.匹配运算 ~ !~ == != 详情见:2)对记录(行)的提取 4.awk环境变量 变量 描述 FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度 FS 输入字段分隔符号 数据源的字段分隔符-F OFS 输出字段分隔符号 RS 输入记录分隔符 ORS 输出记录分隔符号 例: awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd root: x: 0:0:root awk 'BEGIN{FS=":"}NR==1{print $1,$NF}' /etc/passwd root /bin/bash awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$NF}' /etc/passwd root-/bin/bash 5.流程控制 1)if判断语句 awk '{if($1>5)print $0}' num awk '{if($1>5)print $1/2;else print $1*2}' num 2)for循环语句 awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2 3)while循环语句 awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' num2 4)do...while语句 awk '{sum=0;i=1;do{sum+=$i;i++}while(sum<150);print sum}' num2