bash的基础特性
命令行展开 ~ {}
命令别名 alias unalias
命令历史 history
命令补全 当用户输入命令敲tab键的时候 系统会去查找 $PATH中指明路径下自左而右的查找命令
文件名通配 glob
路径补全
快捷键
ctrl +a 跳转到行首
e 跳转到行尾
u 删除行首到光标之间的内容
K 删除行尾到光标的内容
l 同 clear
d 同 exit
bash特性之: 命令hash
缓存此前命令的查找结果
每当用户使用命令时bash会去找hash中缓存的命令 如果没有再去$PATH中去找命令 这样可以大幅加快命令的查找速度
可以使用hash命令查看本次shell缓存的命令
[root@yangyang ~]# hash
命中 命令
2 /usr/bin/cat
1 /usr/bin/ls
1 /usr/bin/su
[root@yangyang ~]# hash -d cat Hash -d 命令 删除-d后面命令的缓存
[root@yangyang ~]# hash
命中 命令
1 /usr/bin/ls
1 /usr/bin/su
[root@yangyang ~]#
[root@yangyang ~]# hash -r Hash -r 清空hash表
[root@yangyang ~]# hash
hash: 哈希表为空
bash特性之: 变量
变量=变量名+指向的内存空间
变量赋值:把我们要存储的数据存储到变量名指定的内存空间
对于shell来说 变量赋值的机制就是 name=value
变量类型:存储格式表示数据范围和参与的运算
比如说字符串123 和 45 相加等于12345
如果是数值 123 和 45 那就是168了
编程语言又可以分为
强类型变量语言 存储的变量是那种类型参与运算时就一定要是那种类型不能有违反规则的地方 比如c语言
弱类型变量语言 比如 bash把所有变量统统视作字符型 要进行数值计算时他会自动转化为数值型,bash不支持浮点数据除非借助外在工具 而且 Bash 的变量无需事先声明
变量替换:把变量名出现的位置替换为其所指向的内存空间中的数据
也就是变量引用 ${name} $name
变量名的规范:
硬规范 只能包含 数字 字母 和下划线 且不能以数字开头 还不能使用系统的保留字(if then while 等)
软规范:见名知意 很重要
Bash的变量类型
本地变量: 作用域仅为当前shell
环境变量:作用域为当前shell进程和其子进程
局部变量:作用域仅为代码片段(函数中声明的变量)
位置参数变量:为执行脚本的shell进程传递参数
特殊变量 :系统内置的变量 如 $? $* $# $@ 等
本地变量:
变量赋值: name=value
变量引用:${name} $name
“$name” : 弱引用变量名会替换为其值
‘$name’ : 强引用变量名不会替换为其值
查看变量 set
撤销变量 unset NAME
本地变量对同级和子级shell是无效的 只对当前sehl有效
环境变量
变量赋值 export name=value
declare -x name=value
注意bash内嵌的许多环境变量 通常为全大写一般用于定义bash的工作环境
如 PATH HISTFILE HISTSIZE HISTFILESIZE PWD HOME 等
环境变量对当前shell和子进程是有效的
查看环境变量 export declare -x printenv env
撤销环境变量 也是 unset NAME
设置只读变量 declare -r NAME
只读变量无法重新赋值 而且不能撤销
Bash特性之多命令执行
无逻辑
命令 中间用;隔开
如 : 命令;命令;命令;命令
命令和命令没有逻辑关系 执行上一个下一个就会执行
运算逻辑
与
命令 && 命令
第一个命令执行成功 第二个命令才会执行
第二个命令执行失败 第二个命令会直接跳过
或
命令 || 命令
第一个命令执行成功 第二个命令直接跳过
第一个命令执行失败 第二个命令才会执行
#上述两个也就是所谓的短路法则
非
If [ ! -n $name ]
判断name的值是否为空
-n 是否为非空字符串 只要字符串非空,就是成立 加上!就会是空字符则成立
Shell脚本
编程语言的分类
编译运行 源代码 > 编译器 > 程序文件
解释运行 源代码 > 运行时启动解释器,由解释器边解释边运行
编辑模型 : 程序=指令+数据
面向过程的语言
过程式编程:以指令为中心来组织代码,数据服务与代码 举例:C语言 bash语言
面向对象的语言
对象式编程 :以数据为中心组织代码,围绕数据来组织指令
首先编写很多类(class)代码,每一个类中所包含数据结构或者说是实例化对象 ,然后对数据(对象)施行操作
举例:java C++ Python(其实c++ 和PY都支持,不是完全面向对象的,但是JAVA是完全面向对象的)
Shell脚本 过程式编程 解释运行 依赖于外部程序文件
Shell脚本是什么?其实就是命令的堆积,但是许多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,
以避免运行出现错误
如何写shell脚本
脚本中第一行顶格 给出shebang 也就是解释器路径,常见的解释器 #!/bin/bash #!/usr/bin/python 然后就是命令的堆积去实现某种功能
为什么文本文件可以执行呢就是因为内核会判断文件的前几个字节也就是shebang
然后用对应的shebang去解释运行下面的代码
这种机制下是直接运行文本文件然后内核去找shebang,也可以直接定义解释器
这就是两种shell脚本的运行方式 ./1.sh 或直接指定解释器 bash 1.sh
注意:1 脚本中除了shebang 余下所有#开头的行都会被注释而忽略
2 shell脚本运行是通过运行一个子shell进程实现的
Bash的配置文件
有两类
profile类 : 为交互式登录的shell提供配置
bashrc类 : 为非交互式登录的shell提供配置 (其实bashrc交互式也会读取)
对于profile类分为
全局配置 /etc/profile 和 /etc/profile.d/*.sh
用户配置 ~/.bash_profile
功能
1,用于定义环境变量
2,运行命令或脚本
bashrc类分为
全局 /etc/bashrc
用户 ~/.bashrc
功用
1用于定义本地变量
2 定义命令别名
登录类型
交互式登录
直接通过终端输入账户和密码后登录的shell进程
和使用 su - USER 或者 su -l USER 执行的登录切换
非交互式登录
su NAME 不加 - 就是非交互式登录
图形化页面打开终端
运行脚本
配置文件的读取次序
对于交互式登录来说
/etc/profile > /etc/profile.d*.sh > ~/.bash_profile > ~/.bashrc > /etc/bashrc
对于非交互登录
~/.bashrc > /etc/bashrc > /etc/profile.d/*.sh
让配置文件立即生效
Source 配置文件
./配置文件