目录
二、bash基础特性(二)【alias、输入重定向、bash快捷键】
三、bash基础特性(三)【逻辑运算】
四、bash基础特性(四)【bash配置文件,条件判断,算术运算】
一、bash基础特性(一)【history】
-
history:记录历史命令
- history记录的环境变量
- $HISTSIZE:命令历史记录的条数
- $HISTFILE:~/.bash_history【记录的命令历史文件:每个一个用户的家目录下,都有这个文件】
- $HISTFILESIZE:命令历史文件记录历史的条数
- -d OFFSET:删除对应的历史条数记录【例子:history -d 333】
- -c:清楚命令历史
- history #:显示命令中最近的#条命令
- -a:手动追加当前会话缓冲区的命令历史至历史文件中
- 调用历史中命令:
- !#:重复执行第#条指令
- !!:重复执行上一条明林
- ! string:重复执行以string开头的最近一个指令
- 调用上一条命令的最后一个参数
- !$:所有终端都会适用
- Esc + .:适用所用的终端
- Alt + .:只能适用部分终端
- 控制命令历史的记录方式
- 环境变量:HISTCONTROL
- ignoredups:忽略重复的命令;连续且相同方式为"重复"
- ignorespace:忽略所有以空白开头的命令
- ignoreboth:ignoredups、ignorespace,两种模式都生效
- 修改环境变量方式:export 变量名="值"
- 变量赋值:把赋值符号后面的数据存储于变量名指向的内存空间
- 环境变量:HISTCONTROL
- history记录的环境变量
-
命令补全
- bash执行命令:【Tab】键
- 内部命令:补全命令
- 外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令命名的文件,第一次找到即为要执行的命令;
- 直接补全:Tab,用户给的字符串只有唯一一条唯一对应的命令;
以用户给定的字符串为开头对应的命令不唯一,则再次Tab会
给出列表
- bash执行命令:【Tab】键
-
路径补全
- 把用户给出的字符串当作路径开头,并在其指定的上级目录下搜索以指定的字符串开头的文件名
- 如果唯一:则直接补全
- 否则:再次Tab,给出列表
-
命令行展开
- ~:展开为用户的主目录
- ~ UserName:展开为指定用户的主目录
- {}:可承载一个以逗号分隔的列表,并将其展开为多个路径
- /tmp/{a,b} = /tmp/a, /tmp/b
- /tmp/{tom,jerry}/hi = /tmp/tom/hi, /tmp/jerry/hi
-
命令行的执行结果状态
- 成功
- $?:bash中的特殊变量$?保存最近一条命令的执行状态结果;
- 0:代表成功
- 失败:
- $?:bash中的特殊变量$?保存最近一条命令的执行状态结果;
- 1-255:失败
- 程序执行结果有两类结果:
- 程序的返回值
- 程序的执行状态
- 成功
二、bash基础特性(二)【alias、输入重定向、bash快捷键】
- 命令别名:alias
- 通过alias命令实现
- alias:显示当前shell进程所有可用的命令别名
- alias NAME='VALUE':定义别名NAME,其相当于执行命令VALUE;
- 注意
- 在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,要定义在配置文件中;
- 仅对当前用户:~/.bashrc
- 对所有用户有效:/etc/bashrc
- 编辑配置给出的新配置不会立即生效;
- source /path/to/config_file:重新加载命令
- . /path/to/config_file:重新加载命令
- 取消别名:unalias
- 格式:unalias [-a] name [name ...]
- unalias -a:取消所有别名
- unalias lftps:取消lftps别名命令
- 注意: 如果别名同原命令的名称,则如果要执行原命令,可使用"\COMMAND";
- 通过alias命令实现
- glob(globbing):bash中实现文件名"通配"
- *:任意长度的任意字符
- ?:任意单个字符
- [ ]:匹配指定范围内的任意单个字符
- [a-z]:不区分字符大小写
- [^]:匹配指定范围外的任意单个字符
- 专用字符集合:
- [:digit:]:任意数字,相当于0-9
- [:lower:]:任意小写字母
- [:upper:]: 任意大写字母
- [:alpha:]: 任意大小写字母
- [:alnum:]:任意数字或字母
- [:space:]:匹配空格
- [:punct:]:标点符号
- bash快捷键
- Ctrl+l: 清屏,相当于clear命令;
- Ctrl+a:跳转至命令开始处;
- Ctrl+e:跳转至命令结尾处;
- Ctrl+c:取消命令的执行;
- Ctrl+u: 删除命令行首至光标所在处的所有内容;
- Ctrl+k: 删除光标所在处至命令行尾部的所有内容;
- bash的的I/O重定向及管道
- 程序:指令+数据【读入数据:input /输入数据:output】
- 打开的文件都有一个fd:file descriptor (文件描述符)
- 系统处理数字,快于文件处理,所以使用文件描述符
- 标准输入:keyborad, 0【0:键盘的文件描述符】
- 标准输出:monitor, 1【1:显示器的文件描述符】
- 标准错误输出:monitor, 2【2:标准错误描述符】
- 程序执行的结果有两种
- 1、程序执行的结果
- 2、程序执行的状态
- 打开的文件都有一个fd:file descriptor (文件描述符)
- I/O重定向:改变标准位置
- 输出正确结果重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
- >:覆盖重定向,目标文件中的原有内容会被清除
- >>: 追加重定向,新内容会追加至目标文件尾部
- bash设置:终端直接输入
- set -C: 禁止将内容覆盖输出至已有文件中【可追加】
- 强制覆盖:>|
- set +C: 开启将内容覆盖输出至已有文件中
- set -C: 禁止将内容覆盖输出至已有文件中【可追加】
- 输出错误结果重定向:COMMAND 2> NEW_POS, COMMAND 2>> NEW_POS
- 2>: 覆盖重定向错误输出数据流
- 2>>: 追加重定向错误输出数据流
- 标准输出和错误输出各自定向至不同位置
- COMMAND > /path/to/file.out 2> /path/to/error.out
- 合并标准输出和错误输出为同一个数据流进行重定向
- &>:覆盖重定向
- &>>:追加重定向
- COMMAND > /path/to/file.out 2> &1;&1到入到第一个输出流/path/to/file.out 2
- 和2为1中输入,标准错误输入,合并到标准输出,第一个数据流/file.out2 文件中去
- COMMAND >> /path/to/file.out 2 >> &1;&1到入到第一个输出流/path/to/file.out 2
- 输出正确结果重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
- 输入重定向:<
- tr命令:转换或删除字符
- 格式:tr [OPTION]... SET1 [SET2]
- tr abc ABC:把小写的a、b、c,替换为大写A、B、C
- tr 'a-z' 'A-Z' < /etc/fstab :把fstab文件中的小写字母,替换为大写字母
- tr -d abc :出现a、b、c字符的都删除
- HERE Documentation:<<【输入重定向:用于创建文档】
- cat << EOF:输入的数据,输入到文件中
- cat > /path/to/somefile << EOF【把EOF之前的输入重定向数据,输出到/path/somefile 文件中】
- cat << EOF:输入的数据,输入到文件中
- 程序:指令+数据【读入数据:input /输入数据:output】
- 管道:COMMAND1 | COMMAND2 | COMMAND3 |...
- 最后一个命令会在当前shell进程的子shell进程中执行
- tee命令:从标准输入读数据,输出到文件和标准输出
- 格式:tee [OPTION]... [FILE]...
- 用法,覆盖输出
三、bash基础特性(三)【逻辑运算】
- 程序:指令+数据
- 过程式:以指令为中心,数据服务于指令
- 对象式:以数据为中心,指令服务于数据
- shell程序:提供了编程能力,解释执行
- 程序的执行方式:【计算机:运行二进制指令;】
- 编程语言:
- 低级:【汇编】
- 高级:【编译:高级语言-->编译器-->目标代码】【C、C++, java】
- 解释:【高级语言-->解释器-->机器代码】【shell, perl, python】
- 过程式编程:顺序执行、循环执行、选择执行
- shell编程:过程式、解释执行
- 编程语言的基本结构:【数据存储:变量、数组】、【表达式】、【语句】
- shell脚本:文本文件
- shebang:【#!/bin/bash】、【#!/usr/bin/python】、【#!/usr/bin/perl 】
- 运行脚本:
- 给予执行权限,通过具体的文件路径指定文件执行
- 直接运行解释器,将脚本作为解释器程序的参数运行
- 变量类型【数据存储格式、存储空间大小、参与运算种类】
- 命名的内存空间
- 数据存储方式:ASCII
- 字符:110:24【三个字节,一个字节八位】
- 数值:110 --> 8【一个字节】【整型】【浮点型】
- 变量:
- 作用:数据存储格式
- 参与的运算
- 表示的数据范围
- 编程程序语言:
- 强类型:java
- 定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误
- 弱类型:bash
- 无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
- 强类型:java
- 逻辑运算:
- true【1】, false【0】
- 与
- 1 && 1 = 1
- 1 && 0 = 0
- 0 && 1 = 0
- 0 && 0 = 0
- 或:
- 1 || 1 = 1
- 1 || 0 = 1
- 0 || 1 = 1
- 0 || 0 = 0
- 非:
- ! 1 = 0
- ! 0 = 1
- 短路运算:
- 与:
- 第一个为0,结果必定为0
- 第一个为1,第二个必须要参与运算
- 或:
- 第一个为1,结果必定为1
- 第一个为0,第二个必须要参与运算
- 与:
四、bash基础特性(四)【bash配置文件,条件判断,算术运算】
- bash中的变量的种类
- 本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
- 环境变量:生效范围为当前shell进程及其子进程
- 局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
- 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数【对应调用第1、第2等参数】
- shift [n] :踢出参数
- shift [n] :踢出参数
- 特殊变量:$?, $0, $*, $@, $#
- $?:上一条的命令的执行状态,0成功,非0失败
- $0:执行的文件名
- $*:传递给脚本的所有参数
- $@: 传递给脚本的所有参数
- $#: 传递给脚本的参数的个数
- 本地变量:
- 变量赋值:name='value'
- value
- 可以是直接字串:name="username"
- 变量引用:name="$username"
- 命令引用:name=`COMMAND`,name=$(COMMAND)
- value
- 变量引用:${name}, $name
- " ":弱引用,其中的变量引用会被替换为变量值
- ' ':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
- 显示已定义的所有变量:set
- 销毁变量:unset name
- 变量赋值:name='value'
- 环境变量:
- 变量声明、赋值:
- export name=VALUE 【导出变量为环境变量】
- declare -x name=VALUE【导出变量为环境变量】
- 显示所有环境变量:【export】、【env】、【printenv】
- 销毁:【unset name】
- bash有许多内建的环境变量:PATH, SHELL, UID, HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1
- 变量声明、赋值:
- 变量命名法则:
- 1、不能使程序中的保留字:例如if, for
- 2、只能使用数字、字母及下划线,且不能以数字开头
- 3、见名知义
- 只读变量
- readonly name
- declare -r name
- bash的配置文件
- 按生效范围划分,存在两类
- 全局配置:
- /etc/profile 【/etc/profile.d/*.sh:配置文件过大时,放在profile.d下所有以.sh的配置文件】
- /etc/bashrc
- 个人配置:
- ~/.bash_profile
- ~/.bashrc
- 全局配置:
- 按功能划分,存在两类:
- profile类:为交互式登录的shell提供配置
- 全局:/etc/profile, /etc/profile.d/*.sh
- 个人:~/.bash_profile
- 功用:
- 用于定义环境变量
- 运行命令或脚本
- bashrc类:为非交互式登录的shell提供配置
- 全局:/etc/bashrc
- 个人:~/.bashrc
- 功用:
- 定义命令别名
- 定义本地变量
- profile类:为交互式登录的shell提供配置
- shell登录:
- 交互式登录:直接通过终端输入账号密码登录;使用“su - UserName”或“su -l UserName”切换的用户
- /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc【加载顺序】
- 非交互式登录:
- su UserName ;图形界面下打开的终端执行脚本;执行脚本
- ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh 【加载顺序】
- 交互式登录:直接通过终端输入账号密码登录;使用“su - UserName”或“su -l UserName”切换的用户
- 编辑配置文件定义的新配置的生效方式
- 重新启动shell进程
- 使用source或.命令进程
- 按生效范围划分,存在两类
- bash中的算术运算【+, -, *, /, %, **】
- 实现算术运算
- let var=算术表达式
- var=$[算术表达式]
- var=$((算数表达式))
- var=$(expr arg1 arg2 arg3 ...)
- bash有内建的随机数生成器:$RANDOM
- let var=算术表达式
- 增强型赋值:+=, -=, *=, /=, %=
- let varOPERvalue
- 例如:let count+=1
- 自增:let var+=1【let var++】
- 自减:let var-=1【let var--】
- let varOPERvalue
- 实现算术运算
- 条件测试
- 判断某需求是否满足,需要由测试机制来实现
- Note: 专用的测试表达式需要由测试命令辅助完成测试过程
- 测试命令格式
- test EXPRESSION
- [ EXPRESSION ]
- [[ EXPRESSION ]]
- Note: EXPRESSION前后必须有空白字符
- bash的测试类型:
- 数值测试:
- -gt: 是否大于
- -ge: 是否大于等于
- -eq: 是否等于
- -ne: 是否不等于
- -lt: 是否小于
- -le: 是否小于等于
- 字符串测试
- ==:是否等于
- >: 是否大于
- <: 是否小于
- !=: 是否不等于
- =~: 左侧字符串是否能够被右侧的PATTERN所匹配
- Note: 此表达式一般用于[[ ]]中;
- -z "STRING":测试字符串是否为空,空则为真,不空则为假;
- -n "STRING":测试字符串是否不空,不空则为真,空则为假
- -z "STRING":测试字符串是否为空,空则为真,不空则为假;
- Note:用于字符串比较时的用到的操作数都应该使用引号
- 数值测试:
- bash自定义退出状态码
- exit [n]:自定义退出状态码
- 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
- 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码;
- exit [n]:自定义退出状态码