目录
一.运行方式
方式一 | 方式二 | 方式三 | 方式四 | 方式五 |
sh test.sh | bash test.sh | chmod a+x ./test.sh | . test.sh | source test.sh |
二.编程习惯
- 在脚本中尽量不用中文
- 脚本名见名知意
- 编写流程控制语句时,先将结构写出来
三.变量
3.1变量的命名
- 变量不能以数字开始
- 多个单词通过_连接
3.2环境变量(全局变量)
由系统定义的变量,用大写字母表示
PATH:当你输入一个命令时,系统会在PATH中定义的目录中查找该命令的可执行文件 |
HOME:指定当前用户的主目录路径 |
USER:当前用户的用户名 |
查看环境变量:echo $PATH
3.3普通变量(局部变量)
定义示例:变量名=变量值
注意:变量名和值之间没有空格
示例:
a="中国"
3.4特殊变量
$0 | 脚本的名称 |
$n | 脚本的第几个参数 |
$# | 脚本的参数个数 |
$* | 取出所有的参数,添加双引号时,整个整体作为一个参数 |
$@ | 取出所有的参数,添加双引号时,每个参数作为独立的参数 |
$? |
前一个命令的返回状态码 $?=0 ==>成功执行前一条命令,$?!=0反之
|
$$ |
返回本程序的进程
ID
(
PID
),不常用
|
$! |
获取上一个在后台工作的进程的进程号,不常用
|
$_ |
保存之前执行的命令的最后一个参数,不常用
|
注意:当$n中n>=10时,需改成${10},${11}的形式
3.5变量子串
统计字符数方法:
方式一:
[root@serverc ~]# name="mkhfe"
[root@serverc ~]# echo $name
mkhfe
[root@serverc ~]# echo ${#name}
5
方式二:
[root@serverc ~]# echo $name | wc -L
5
方式三:
[root@serverc ~]# echo $name | awk '{print length()}'
5
子串截取:
方式一:
[root@serverc ~]# text="huekjf jhy"
[root@serverc ~]# echo ${text:5} #从指定位置截取到末尾
f jhy
[root@serverc ~]# text="huekjf jhy"
[root@serverc ~]# echo ${text:5:3} #从指定位置截取到指定的长度位置
f j
方式二:
[root@serverc ~]# echo $text | cut -c 1-4
huek
3.6变量赋值
1.直接赋值
var=a
2.引用其他命令结果赋值
ip=`date'
或
ip=$(date)
3.交互式变量赋值
read -p "a number" number
4.脚本传参赋值
$1 $2 $3
四.运算方式
4.1$(( ))
[root@serverc ~]# c=$((1+2))
[root@serverc ~]# echo $c
3
4.2let
[root@serverc ~]# let c=1+2
[root@serverc ~]# echo $c
3
4.3expr
[root@serverc ~]# expr 1 + 2
3
[root@serverc ~]# expr 1 \* 2
2
注意:
- 乘法运算时需要加转义符,因为*会被识别为通配符
- 运算的符号两边存在一个空格
4.4bc(小数运算)
[root@serverc ~]# echo 4/3 |bc -l
1.33333333333333333333
4.5$[ ]
[root@serverc ~]# echo $[1+2]
3
4.6awk
[root@serverc ~]# awk 'BEGIN{print 1/3 3/7}'
0.3333330.428571
#传参方式
[root@serverc ~]# x=1
[root@serverc ~]# y=2
[root@serverc ~]# awk -vn1=$x -vn2=$y 'BEGIN{print n1+n2}'
3
4.7总结运算方式
bc, awk可用于小数运算,其余方式只能进行整数运算
五.条件测试语句
5.1文件
[root@serverc ~]# [ -d /etc ];echo $?
0
[root@serverc ~]# [ -f /etc/hosts ];echo $?
0
[root@serverc ~]# [ -e /etc/passwd ];echo $?
0
5.2条件测试表达式
[ "$num" -eq 1 ] && {
echo 1
exit 0
}
[ "$num" -eq 2 ] && {
echo 2
exit 0
}
5.3字符串
[ "name"="root" ]||{
echo "you are not root"
exit 1
}
六.条件语句
case "$1" in
[a-z])
echo "Lowercase letter."
;;
[A-Z])
echo "Uppercase letter."
;;
[0-9])
echo "Number."
;;
*)
echo "Other type."
;;
esac
七.循环
7.1while
7.2exit 和continue
7.3for循环
7.3.1带列表的for循环语句
7.3.2不带列表的for循环语句
7.3.3类C风格的for循环语句
八.正则表达式
8.1基础正则
1)^ 以......开头的行
- ^root 以root开头的行
2)$ 以......结尾的行
- 448¥ 以448结尾的行
排除文件中的空行:
4).(点) 任意一个字符
注意:不匹配空行
匹配文件以.结尾的行:
6)*前一个字符连续出现0次或0次以上
7).* 所有内容
8) [ ] [abc] 1次匹配1个字符, 匹配任何一一个字符(a或b或c)
匹配文件中的大小字母及数字:
总结:
●[] 里面的内容去掉特殊含义
●[a-z |A-Z|0-9]匹配大小写字母和数字,匹配|
9)[^] [^abc] 取反,排除排除a或b或c的内容, 匹配a或b或c之外的内容
8.2扩展正则
1) + 前一个字符出现一次或一次以上
2) | 或者
[ ] 与 |
3) ( ) 被括起来的内容表示一个整体
4) {} 连续出现o{n,m} 前一个字母o,至少连续出现n次,最多连续出现m次
5)? 连续出现 前一个字符出现0次或1次
扩展正则总结:
九.三剑客
9.1grep
-A:
-c:
-w:
-v:
9.2sed
sed格式:
sed命令功能:增删改查
sed执行过程:找到某一行,进行增删改查
9.2.1sed-查找p
指定行号:
指定行号范围:
从某一行到最后一行:
里面的$表示最后一行
过滤:
范围过滤:
9.2.2sed-删除d
用法同查找
企业案例:删除文件中的空行和包含#的行
法一:
法二:
!的妙用:
9.2.3sed-增加cai
9.3awk
9.3.1特点与应用场景
awk内置变量:
9.3.2行与列
1)取行
2)取列
●-F指定分隔符指定每一 -列结束标记(默认是空格,,连续的空格,tab键)
●$数字取出某一列,注意:在awk中$内容- -个意思表示取出某- -列
●$0整行的内容,
●{print xxX}
●$NF表示最后- -列
9.3.3正则
- ~:包含
- !~:不包含
9.3.4范围
- /开始/,/结束/
9.3.5特殊模式BEGIN{}和END{}
END{}统计计算:
统计/etc/services里面有多少空行:
#seq 100 求和1+2+3+...+100 awk实现