1.shell
Shell 命令行解释器,Linux的脚本编程语言
1.1 变量
- 常用系统变量:$HOME $PWD $SHELL $USER……
- 严格的空格规则
- 等号两侧不能有空格
- 变量中存在空格,可以使用“”或者()包裹
- expr 运算符间必须要有空格
- 条件判断[] 内部左右两侧都要有空格
- if、while、for 后要有空格
- bash中默认类型都是字符串类型
- export 提升变量为全局变量
- $0 脚本名 , 1 − 9 参 数 , 1-9 参数, 1−9参数,# 获取参数个数
- ∗ 获 取 所 有 参 数 , 可 直 接 用 于 f o r 循 环 , 用 “ * 获取所有参数,可直接用于for循环,用“ ∗获取所有参数,可直接用于for循环,用“*”,则把会进行拼接操作
- @ 获 取 所 有 参 数 , 转 成 列 表 , 用 “ @ 获取所有参数,转成列表,用“ @获取所有参数,转成列表,用“@”,效果一样
- $? 获取上条命令返回值
1.2 运算符
- 数值运算方式:$(()) 、 $[]、expr
- 乘法运算符:
在[]内部为* 在expr中为\*
1.3 条件判断
- 数值比较判断:-lt -le -eq
- 文件权限判断:-r -w -x
- 文件类型判断:-f -e -d
- 字符串比较判断:=
- 多条件判断:&& 与 || 或
1.4 流程控制
- if 选择语句:
if [ xxx ];then
xxx
elif [ xxx ];then
fi
- case选择语句:
case $var in
xxx)
xxx
;;
xxx)
xxx
;;
*)
xxx
;;
easc
- for 循环语句:
for ((xxx;xxx;xxx))
do
xxx
done
for item in x y z
do
xxx
done
- while 循环语句:
while [ xxx ]
do
xxx
done
1.5 控制台输入
-
read xxx
-p “提示信息”
-t 等待时间s
1.6 函数
- 系统函数
-
basename 文件名截取
basename /home/aaa/example.txt # out:expample.txt basename /home/aaa/example.txt .txt #out:example
-
dirname 文件路径截取
dirname /home/aaa/example.txt # out:/home/aaa
-
自定义函数
function funname(){ xxx } # 由于shell脚本是逐行运行,所以调用函数前必须先声明 # 函数的形参,通过$n指定,调用函数方式:funname $x $y ……
1.7 工具
- cut :裁剪数据, 默认“\t”
-
-f:列号,多列用“,”连接,范围用“-”
-
-d:分隔符
ifconfig eth0 |grep inet|cut -d " " -f 10 # 切出linux本机IP地址,版本不同,显示不同
- sed: 流编辑器,一次处理一行,不会改变源文件内容
-
-e edit的缩写,在多个命令之前的短选项
-
a 新增add
"na xxx" # 表示在第n行下面插入xxx
-
d 删除 delete
"/xxx/d" # 表示删除xxx的那一行
-
s 替换 replace
"s/old/new/g" # 表示把old替换成new
-
- awk: 文本分析工具,逐行读入,以分隔符进行切割,默认分割符“ ”
-
-F : 指定分隔符
-
-v : 定义变量
awk -F "x" '/pattern/ {action}' filename #找出匹配到pattern的行,以“x”分割,执行action动作 BEGIN END # 匹配行的开头和结尾 -v i=1 # 后续使用变量i时,不需要使用$i,直接使用 i 即可
- 内置变量
- FILENAME :文件名
- NR: 行号
- NF: 每行切割后的列数
ifconfig eth0|grep inet|awk -F " " '{print $2}' # # 和cut一样切出linux本机IP地址,版本不同,显示不同
- 内置变量
- sort : 文件排序
- -n : 按照数值大小排序number
- -r : 反转排序reverse
- -t : 指定排序所用分隔符
- -k : 指定排序的列
sort -t 'x' -nk y filename # 按照x进行分割,按照y列进行排序
1.8 题库
-
查询file.txt中空行所在的行号
awk '/^$/ {print NR}' file.txt
-
计算file.txt第二列的和并输出[每一行的格式为:name score]
cat file.txt |awk -F " " '{sum+=$2} END{print sum}'
-
shell 检查文件是否存在
if [ -f file.txt ];then echo "exists" else echo "not exsits" fi
-
对数字文件进行排序
sort -n file.txt
-
查找/home 文件夹下所有文本,文本内容包含“xxx”的关键字
grep -r "xxx" /home |cut -d ":" -f 1