Bash Shell #
Review
- 2019/09/04
 - 2020/02/29
 
第一个流行的Shell是有Steven Bourne开发的,为感激他的奉献,命名为BourneShell(sh)。 bash是Bourne shell的增强版本,也是机遇GNU的架构下发展出来的,称为Bourne Again SHell(bash)。
Bash shell功能
- 历史命令
 - 命令与文件补全功能
 - 命令别名设置功能
 - 任务管理、前台、后台控制:(job control、foreground、background)
 - 程序化脚本(shell script)
 - 通配符(Wildcard)
 
基础命令 #
查询命令是否为 bash shell 内置命令:type
type ls
type cd变量 #
- 环境变量,通常以大写字符表示,自定义变量驼峰命名即可
 - 变量的使用 
$var, or${var} - 变量与变量内容以一个等号来连接,等号两边不能直接接空格
 - 双引号内的变量会动态取值,单引号不能注入变量值。
 - 执行一串命令,需要执行其他额外命令来提供信息,可通过 
commandor $(command) - 如:
version=$(uname -r) - 若变量需要在其他子程序执行,则需要以export来是变量变成环境变量。子进程不会继承父进程的自定义变量。
 - 取消变量的方法为使用 
unset 
环境变量相关命令 #
env用于观察环境变量set用于观察所有变量(环境变量+自定义变量)export展示所有的环境变量
特殊变量 #
$?上个执行命令的返回值- 成功执行返回0
 - 执行错误返回非0值
 
$$当前Shell的进程ID$0当前脚本的名称$1-$9脚本的参数$#传递给脚本的参数个数$*所有参数作为一个字符串$@所有参数作为独立的字符串
变量操作 #
# 变量声明
declare -i number=42
declare -r readonly_var="constant"
# 设置为整数
typeset -i var=5+3    # var=8
declare -i var=5+3     # 效果相同
# 只读变量
typeset -r PI=3.14
declare -r PI=3.14     # 等效操作
# 大小写转换
typeset -u UPSTR="hello"  # UPSTR="HELLO"
declare -l LOWSTR="WORLD" # LOWSTR="world"
# 变量替换
${var:-default}  # 如果var未设置,使用default
${var:=default}  # 如果var未设置,设置var为default
${var:+value}    # 如果var已设置,使用value
${var:?message}  # 如果var未设置,显示错误信息
# 字符串操作
${#var}          # 字符串长度
${var:start:len} # 子字符串
${var#pattern}   # 删除最短匹配前缀
${var##pattern}  # 删除最长匹配前缀
${var%pattern}   # 删除最短匹配后缀
${var%%pattern}  # 删除最长匹配后缀历史命令 #
history查看历史命令!number执行第number条命令!command向前查找开头为command的命令并执行!!执行上一个历史命令!$上一个命令的最后一个参数!^上一个命令的第一个参数!*上一个命令的所有参数
配置文件 #
/etc/profile系统整体的设置~/.bash_profile用户登录时执行~/.bashrc每次打开新终端时执行~/.bash_logout退出登录时执行
使用 source 或 . 命令重新加载配置文件:
source ~/.bashrc
# 或
. ~/.bashrc通配符 #
*匹配任意多个字符?匹配单个字符[]匹配指定范围内的字符[!]匹配不在指定范围内的字符{}生成多个匹配项
正则表达式 #
[:alnum:][0-9A-Za-z]# 字母和数字[:alpha:][a-zA-Z]# 字母[:blank:]空格键,Tab键[:space:]任何会产生空白的字符,包括空格键、【Tab】、CR等[:cntrl:]控制按键,CR, LF, Tab, Del[:digit:][0-9]# 数字[:graph:]可打印的非空白字符[:lower:][a-z]# 小写字母[:upper:][A-Z]# 大写字母[:print:]可打印字符,包括空格[:punct:]标点符号[:xdigit:][0-9A-Fa-f]# 十六进制数字
示例
sed -i '' 's/\t/[[:space:]]{2}/g' nginx.conf重定向 #
>输出重定向(覆盖)>>输出重定向(追加)<输入重定向2>错误输出重定向&>标准输出和错误输出重定向|管道,将前一个命令的输出作为后一个命令的输入
进程控制 #
&后台运行jobs查看后台任务fg将后台任务调到前台bg继续运行后台任务Ctrl+Z暂停当前任务Ctrl+C终止当前任务
常用快捷键 #
Ctrl+A移动到行首Ctrl+E移动到行尾Ctrl+U删除到行首Ctrl+K删除到行尾Ctrl+R搜索历史命令Ctrl+L清屏Ctrl+D退出终端Tab命令补全Ctrl+B向后移动一个字符Ctrl+F向前移动一个字符
调试技巧 #
# 启用调试模式
set -x
# 禁用调试模式
set +x
# 检查脚本语法
bash -n script.sh
# 跟踪脚本执行
bash -v script.sh最佳实践 #
- 使用引号保护变量和字符串
 - 使用 
[[ ]]进行条件测试 - 使用 
set -e在出错时立即退出 - 使用 
set -u检查未定义变量 - 使用 
set -o pipefail检查管道命令的失败 - 使用函数组织代码
 - 添加适当的注释
 - 使用有意义的变量名
 - 处理错误情况
 - 使用 
trap处理信号