什么是Shell
介绍
Shell 是linux内核的命令解释器,在底层硬件和linux内核之间起到一个中间人的作用,我们在shell端输入的命令可以被它解释成linux内核可以理解的语言,然后linux内核来完成硬件的交互 然后返回结果
下图很直观:
Shell 的分类
Shell脚本的执行方式-- 编写一个shell脚本
vim hello.sh --创建一个shell脚本
第一行 #!/bin/bash 是必写的 用来申明这是一个shell脚本
然后其他内容可以自己来写啦
运行 shell脚本 ./hello.sh or /root/hello.sh 绝对路径或者相对路径
我第一次没有运行成功 是因为没有执行权限 改一下权限就可以运行了
Bash的功能
history命令 -用来查历史使用命令
解释一下 把缓存中的历史命令写入历史保存文件 家目录下的 .bash_history 文件下
一般我们执行的命令,使用history 可以查到,但此时的命令记录还没有写入这个文件,只有我们退出之后重新登陆才可以看到,如果使用-w,就是直接写入了,不需要退出登陆
命令别名:
查看命令别名: alias
给vim 取别名 vi
alias vim=’vi’
unalias 别名 删除别名
要想让别名永久生效:需要改配置文件 是家目录下的.bashrc文件
对root来说 /root/.bashrc 对user1用户来说 /home/user1/.bashrc
把别名写进去就行了。
Bash 常用快捷键:
输入输出重定向:
首先理解什么叫做输出重定向,就是把原本应该输入到屏幕显示出来的内容输入到一个文件里面了。
输出重定向的分类
就是你当你输入错误命令的时候,使用标准错误输出重定向 会把错误信息输入到文件里面
你输入的命令是正确的时候,会把命令的结果输出到文件里面,这两个命令不能混用。
如果嫌分类有点麻烦 可以使用如下命令: 就不用区分命令错误或者正确了。
这里注意一个文件 /dev/null 可以把他看作垃圾箱,往里面输入的数据都会消失掉,一般在shell脚本输出的一些作用不大的信息,我们会直接重定向到这个文件里面。
输入重定向:
不用我们手来敲打内容输入到文件里面,而是直接把文件内容作为输入到另一个文件里面。
例如:
这里直接把文件的内容作为WC命令的输入了。
多命令顺序执行:
管道符:
举个例子:
通配符:
其他特殊符号:
shell中的变量
包括
用户自定义变量
环境变量
位置参数变量
预定义变量
变量的概念在编程语言里面已经谈泛了,概念也是类似的
变量分类:
用户自定义变量:
第二个 aa输出 是123456
set 命令 可以查看系统当中的所有变量 包括环境变量
unset 变量名 删除变量
环境变量:
环境变量是什么:
怎么理解shell和子shell 怎么理解shell和子shell
我们一开始登陆进去,是拥有shell的,这里我们输入 bash命令 再进入一个shell,这个shell就是子shell 我在第一个bash中 用户自定义变量可能在第二个bash 中就看不到了
举个例子:
在第一个Shell(也就是父shell里面)
可以看到 name变量
第二个bash 中
看不到 name 这个变量了
设置环境变量
pstree 可以看到当前shell解释器关系 :
创建子shell bash之后
系统常见的环境变量:
这就解释了为什么我们不用输入命令的绝对路径 就可以执行,全靠PATH这个变量,系统会向PATH路径指定的位置去寻找命令,这也是PATH命令的作用,当然我们也可以手工来定义添加路径。
系统提示符就是这个东西: 是可以根据需要进行修改的。
位置变量参数:
这个和大多数编程语言差不多,可以理解理解成一种占位符,学过C的我们都知道
printf(“welcomte to C %d’,a) 相当于把a这个变量的值写入%d这个位置。
举个例子:
我编写的sh脚本:
预定义变量:
环境变量实则属于特殊的预定义变量
接受键盘输入:
举个例子 :
数值运算与运算符
这里的数值运算与编程语言差别还是有的:
这个CC变量的结果并不是aa和bb的数值相加,而是字符串形式连接
采用上面的方法,声明为整数然后相加 是一种实现方式:
这个也是一种方法:
更常用的方法:
运算符:(和大多数编程语言大同小异)
变量测试:
用的时候查一下表就好了,主要是对y变量是否存在做一个检测,因为在编写shell脚本的过程中,计算机不能像人一样识别,从肉眼看出来y存不存在,它只能通过一些指令和返回的结果来判断
环境变量的配置文件:
一旦写入,永久性生效,开启重启仍然有效
source 配置文件 --一般我们修改完环境变量配置文件之后,得重新登录重启后才生效,使用这个命令可以直接生效
五个环境变量的配置文件如下:
环境配置文件的作用和调用顺序:
解释一下 我们在输入账号密码登录之后,在我们看到命令提示符之前
会经过这么多个读取步骤,每个配置文件都有相应的环境变量,读取它们,要注意的就是,到第7步之后,如果你此时不需要账号密码登陆(比如你登陆之后,再创建一个bash)这个时候会执行2 3 4 步骤。
配置文件的一些说明:
/etc/profile 文件:
~/.bash_profile的作用
/etc/bashrc的作用
其他配置文件的登陆信息:
注销时生效的环境变量配置文件 ~/.bash_logout
历史命令配置文件 ~/bash_history
本地终端(从本机登陆)欢迎信息配置文件 /etc/issue
远程终端欢迎信息: /etc/issue.net
登录后欢迎信息 /etc/motd 不管是远程登陆还是本地登陆都可以显示出来。
Shell编程
正则表达式:(基本概念和其他编程语言中的差不多,用法语法上面可能有点区别)
正则表达式是包含匹配 通配符是完全匹配
基础正则表达式:
字符截取命令: cut、grep、printf、awk、sed
cut命令: --用于提取列
默认的分隔符 是TAB键
Demo:
cut -d “:” -f 1,3 /etc/passwd 以“:”作分割
cut 命令主要是截取列的,它的局限是不能以空格作为分割。
grep命令 主要是截取行的
Demo:
printf命令 格式化输出:和编程语言有点类似
printf命令主要是配合awk命令来使用的
awk命令 带条件性截取列:
Demo:
以上两个awk使用都没有条件,直接printf格式化输出了。
FS指定分隔符:
awk命令带条件的例子:
sed命令 :
Demo:
用例子来体会:
字符处理命令:
Sort
Wc命令:
条件判断:
语法:
使用 test 或者[ ]
1.按文件类型进行判断:
Demo:
第一种写法:
第二种写法:
注意使用中括号这种形式 一定要空格 !
1.按照文件权限进行判断
Demo:
所属者,所属组,其他人中只要含有w权限就为真。
两个文件之间的比较:
两个整数之间的比较:
字符串的比较:
Demo:
多重条件判断:
Demo:
流程控制:
If 语句 语法格式 以及 简单举例 :
注意空格 对仗 一般感觉用第二个格式顺眼一点吧
Demo:
Demo:
注意使用else 不用加 then
case语句:
While 循环:
书写规则坑太多了。。。。一定要注意书写规范
Until 就是while 反着来。while是当条件满足时,执行语句
Until 就是直到条件满足时才停止
for 循环
语法 1
语法2