Shell学习
我们一般说的shell默认是bash shell,也就是Bourne Again Shell (/bin/bash)
- Shell脚本名称一般一般以.sh结尾
- 不能使用特殊符号、空格
- 见闻之意,名称要写的一眼看出来功能
- Shell编程,首行需要 #!、bin/bash 开头
- shell脚本 变量 不能以 数字、特殊符号开头,可以使用下划线_,但是不能用-
echo输出命令
echo “要输出的内容”
-e : 支持反斜线控制的字符转换
echo -e "ab\bc"
输出:ac
更多的反斜杠如下:
控制字符 | 作用 |
---|---|
\\ | 输出\本身 |
\a | 输出警告音 |
\b | 向左删除一位 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | ESCAPE建 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
颜色输出 | \e**[1;31m** abcd \e[0m 输出abcd为红色 31m代表红色 |
颜色输出:
30m | 黑色 |
---|---|
31m | 红色 |
32m | 绿色 |
33m | 黄色 |
34m | 蓝色 |
35m | 洋红 |
36m | 青色 |
37m | 白色 |
第一个脚本
cat shell.sh
#直接查看文件内容 加-A 查询隐藏得回车空格等
在Windows上编译得脚本和在Linux上编译得脚本会存在一些差别,例如回车等,使用dos2unix后面加文件名进行格式转化。
Bash基本命令
history命令
-c:清除历史命令
-w:把缓存中得历史命令写入到历史命令保存文件 文件地址:~ /.bash_history
历史命令默认会保存1000条,可以在/etc/profile中进行修改
历史命令得调用
!n #重复执行第n条命令
!! #重复执行上一条命令
!字串 # 重复执行最后一条以该字串开头得命令
命令别名
顾名思义,给命令起别名
alias vi ='vim'
unalias 别名 #删除别名
alias 查询命令别名
这样设置得别名会在系统重启后失效,要想让别名永久生效,需要修改文件
vi /root/.bashrc
Bash常用得快捷键
ctrl+c | 强制终止当前得命令 |
---|---|
ctrl+L | 清屏 |
ctrl+U | 删除或剪切光标之前的命令;K 删除或剪切光标之后的命令 |
ctrl+y | 粘贴ctrl+u或k的内容 |
ctrl+r | 搜索 |
ctrl+d | 退出当前终端 |
Bash基本功能-输入输出重定向
1.标准输入 键盘 0 标准输出 显示器 1 标准错误输出 显示器 2
输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 >>文件 | 已覆盖的方式 |
标准输出重定向 | 命令>>文件 | 已追加的方式 |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式 |
标准错误输出重定向 | 错误命令 2>> 文件 | 以追加的方式 |
2和>>之间不能加空格
上述的这两种方式在实际的工作中作用不是很大,使用较多的是下面的命令:
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖,正确和错误输出都保存在一个文件 |
---|---|---|
正确输出和错误输出同时保存 | 命令 >> 文件 2>&1 | 以追加,正确和错误输出都保存在一个文件 |
正确输出和错误输出同时保存 | 命令 &>文件 | 以覆盖,正确和错误输出都保存在一个文件 |
正确输出和错误输出同时保存 | 命令 &>>文件 | 以追加,正确和错误输出都保存在一个文件 |
正确输出和错误输出同时保存 | 命令>>文件1 2>>文件2 | 以追加,正确输出到文件1,错误输出到文件2 |
/dev/null 类似于windows中的垃圾箱,不想要的东西可以mv或者输出到该路径下。
输入重定向
wc [ 选项 ] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
多命令顺序执行与管道符
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ;命令2 | 多个命令顺序执行,命令之间没有任何逻辑的联系 |
&& | 命令1&&命令2 | 逻辑与,当命令1正确执行,才去执行2,当1执行不正确,则2不会执行。 |
|| | 命令1||命令2 | 逻辑或,当命令1执行不正确,则执行2,当1正确执行,则2不执行。 |
dd命令
dd if=输入文件(原文件) of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或者原设备
of=输出文件 指定目标文件或者目标设备
bs=字节数 指定一次输出/输出多少字节,即把这些字节看作一个数据块
count=个数 指定输入/输出多少个数据块
例子:
date ; dd if=/dev/zero of=/root/testfile bs=1kb count=100000 date
#用输出的两次时间间隔来看系统创建100mb大小的文件需要多久
# /dev/zero 代表0
常用的命令格式:命令 && echo yes || echo no
理解下上面命令包含的含义
管道符
命令1 | 命令2
#命令1的正确输出作为命令2的操作对象,所以要求命令1必须要有正确的输出。
例子:
ll -a /etc/ | more
例子:
netstat -an | grep "established"
#查询所有的网络连接
grep的作用:搜索内容
grep “要搜索的内容” 搜索地址
选项:
-i:忽略大小写
-n:输出行号
🟥-v:反向查找,取反
–color=auto: 搜索出来的关键字用颜色显示
通配符和其他特殊符号
常见的通配符:
通配符 | 作用 |
---|---|
? | 匹配任意一个字符 |
* | 匹配0个或多个任意字符,也就是匹配任意内容 |
[ ] | 匹配括号中任意一个字符 |
[ - ] | [1-9]代表匹配1-9中任意一个 |
[ ^ ] | 逻辑非,代表除了括号内的任意一个,[ ^0-9]代表匹配的是一个非数字的字符 |
$( ) 用来引用系统命令,在 Bash中会先执行它。
abc =$(date)
echo = abc
#输出当前系统时间
用户自定义变量
在Bash中,变量默认是字符串类型,如果要进行数值的计算,则必须指定变量未数值型。
变量的值有空格,需要将值用单引号或者双引号进行引用
变量分类
- 用户自定义变量
- 环境变量
- 位置参数变量
- 预定义变量
Bash数值运算与运算符
declare 声明变量类型
declare[+/-] [ 选项 ] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
最常见的还是使用 (( )) 这种形式
aa=11
bb=22
ff=$(($aa+$bb))
gg=$[$aa+$bb]
#上面这两种方式都可以直接进行述职计算,也是我们最常用的用法
正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外的任意一个字符 |
^ | 匹配行首。例如: ^hello 会匹配以hello开头的行。 |
$ | 匹配行尾。hello&会匹配以hello结尾的行 |
[ ] | 匹配括号中任意一个字符 |
[ ^ ] | 匹配非括号内的任意一个字符 |
\ | 转义符,用于取消特殊符号的含义 |
\ {n\ } | 前面字符恰好出现n次,[0-9]\ {4 \ }匹配四位数字,[1] [3-8] [0-9]\ {9\ }匹配手机号 |
\ {n,\ } | 表示匹配前面的字符出现不小于n次,大于等于 |
\ {n,m\ } | 表示前面的字符最少出现n次,最多出现m次 |
[^0-9]\{2\}
[a-z]\{4\}
grep "a*" test_rule.txt # 正则表达式中*代表重复0次或者多次,记住这个0次。 所以这个查询会列出该文件所有的内容
grep "a..d" test_trle.txt #.点代表任意一个字符。所有s和d之间一定有两个字符的单词
grep "s.*d" test_rule.txt #s和d之间有任意字符
grep ".*" test_rule.txt #匹配所有内容
grep "^[^0-9]\{2\}
[a-z]\{4\}
grep "a*" test_rule.txt # 正则表达式中*代表重复0次或者多次,记住这个0次。 所以这个查询会列出该文件所有的内容
grep "a..d" test_trle.txt #.点代表任意一个字符。所有s和d之间一定有两个字符的单词
grep "s.*d" test_rule.txt #s和d之间有任意字符
grep ".*" test_rule.txt #匹配所有内容
grep "^$" test_rule.txt #匹配空白行
grep "^[^a-zA-Z]" test_rule.txt #匹配不以字母开头的行
grep "\.$" # 匹配以.结尾的行
quot; test_rule.txt #匹配空白行
grep "^[^a-zA-Z]" test_rule.txt #匹配不以字母开头的行
grep "\.[^0-9]\{2\}
[a-z]\{4\}
grep "a*" test_rule.txt # 正则表达式中*代表重复0次或者多次,记住这个0次。 所以这个查询会列出该文件所有的内容
grep "a..d" test_trle.txt #.点代表任意一个字符。所有s和d之间一定有两个字符的单词
grep "s.*d" test_rule.txt #s和d之间有任意字符
grep ".*" test_rule.txt #匹配所有内容
grep "^$" test_rule.txt #匹配空白行
grep "^[^a-zA-Z]" test_rule.txt #匹配不以字母开头的行
grep "\.$" # 匹配以.结尾的行
quot; # 匹配以.结尾的行
字符截取命令-cut命令
cut字段提取命令
cut [选项] 文件名
选项:
-f列号: 提取第几列,多列用逗号隔开,默认在制表符下生效
-d分隔符: 按照指定分隔符分割列,
cut -d ":" -f 1,3 /etc/passwd
#提取文件的1/3列
df -h #查看系统磁盘情况
df -h | grep "sda5$" | cut -f 5
#查询系统磁盘,然后得到dev/sda5行的结果,然后得到具体的一列。这个命令得到的结果不是我们想到要的,因为df -h查询出来的结果表格不是用制表符tab隔断的,而是用空格断开的。没法提取到第5列的数据,这个就是需要用到我们下面的awk命令。