# Shell
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂载、停止甚至是编写一些程序
Shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell 是解释执行的脚步语言,在 Shell 中可以直接调用 Linux 系统命令
# Shell 的分类
语法类型:
- Bourne Shell: 从 1979 起 Unix 就开始使用 Bourne Shell,Bourne Shell 的主文件名为 sh
- C Shell: C Shell 主要在 BSD 版的 Unix 系统中使用,其语法和 C 语言类似而得名
Shell 的两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。Bourne 家族主要包括 sh, ksh, Bash, psh, zsh。 C 家族主要包括 csh, tcsh
检测当前系统用的是什么 Shell:
echo $SHELL
1
Bash: Bash 与 sh 兼容,现在使用的 Linux 就是使用 Bash 作为用户的基本 Shell。可以查看 /etc/shells 查看 Linux 支持的 Shell
# echo 输出命令
echo [选项] [输出内容]
1
选项:
- -e: 支持反斜线控制的字符转换(mac 可以省略)
控制字符 | 作用 |
---|---|
\a | 输出警告音 |
\b | 退格键,就是想做删除键 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是 Tab 键 |
\v | 垂直制表符 |
\0nnn | 按照八进制 ASCLL 码表输出字符。其中0为数字零,nnn为三位八进制数 |
\xhh | 按照十六进制 ASCLL 码表输出字符。其中 hh 是两位十六进制数 |
颜色输出:
echo -e "\e[1;31m嫁人就要嫁\e[0m"
# \e[1; 开启颜色, \e[0m 关闭颜色
1
2
2
- 30m: 黑色
- 31m: 红色
- 32m: 绿色
- 33m: 黄色
- 34m: 蓝色
- 35m: 洋红色
- 36m: 青色
- 37m: 白色
# Shell 脚本执行
编写第一个脚本,编写 hello.sh
#!/bin/bash
# the first program
echo "hello world"
1
2
3
4
2
3
4
脚本执行方式:
- 赋予执行权限,直接运行
- chmod 755 hello.sh
- ./hello.sh
- 通过Bash调用执行脚本
- bash hello.sh
# Bash 的基本功能
- 命令别名与快捷键
- 历史命令
- 输出重定向
- 多命令顺序执行
- Shell中特殊符号
# 别名查看与设置
# 查看本机已经设置的别名
alias
# 设置别名,临时生效
alias ls='ls --color=never'
# 永久生效别名
vi ~/.bashrc # 增加别名
source ~/.bashrc
# 临时删除别名
unalias [别名]
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
命令生效顺序:
- 第一顺位执行用绝对路径或相对路径执行的命令
- 第二顺位执行别名
- 第三顺位执行 Bash 的内部命令
- 第四顺位执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令
# 常用快捷键
- ctrl+c: 强制终止当前命令
- ctrl+l: 清屏
- ctrl+a: 光标移动到命令行首
- ctrl+e: 光标移动到命令行尾
- ctrl+u: 从光标所在位置删除到行首
- ctrl+z: 把命令放入后台
- ctrl+r: 在历史命令中搜索
# 历史命令
history [选项] [历史命令保存文件]
history
# 默认的历史命令保存 1000 条,可以修改 /etc/profile
1
2
3
4
5
2
3
4
5
选项:
- -c: 清空历史命令
- -w: 把缓存中的历史命令写入历史命令问价 ~/.bash_history
历史命令的调用:
- 使用上下箭头调用以前的历史命令
- 使用 !n 重复执行第 n 条历史命令
- 使用 !! 重复执行上一条命令
- 使用 !字符串 重复执行最后一条以该字符串开头的命令
# 输出重定向
# 标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
# 输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 |
标准输出重定向 | 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
标准错误输出重定向 | 错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中 |
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把命令的正确输出和错误输出都保存到指定的文件或设备当中 |
正确输出和错误输出同时保存 | 命令 >> 文件 2>&1 | 以追加的方式,把命令的正确输出和错误输出都保存到指定的文件或设备当中 |
正确输出和错误输出同时保存 | 命令 &> 文件 | 以覆盖的方式,把命令的正确输出和错误输出都保存到指定的文件或设备当中 |
正确输出和错误输出同时保存 | 命令 &>> 文件 | 以追加的方式,把命令的正确输出和错误输出都保存到指定的文件或设备当中 |
正确输出和错误输出同时保存 | 命令 >> 文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
# 输入重定向
# ctrl + d 退出
wc [选项] [文件名]
1
2
2
选项:
- -c: 统计字节数
- -w: 统计单词数
- -l: 统计行数
输入重定向:
- 命令 < 文件: 把文件作为命令的输入
- 命令 << 标识符: 标识符把标识符之间的内容作为命令的输入
# 将文件作为输入,交给 wc 处理,当然这里不加 < 也可以
wc < test.log
# 将 test 作为标记,当输入内容为 test 时,退出输入
wc << test
1
2
3
4
5
2
3
4
5
# 管道符
# 多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑关系 |
&& | 命令1 && 命令2 | 逻辑与,当命令1正确执行,则命令2才会执行 |
# 管道符
命令1 | 命令2
# 命令 1 的正确输出作为命令 2 的操作对象
netstat -an | grep ESTABLISHED | wc -l
1
2
3
4
2
3
4
# 通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或多个任意字符,就是可以匹配任何内容 |
[] | 匹配括号中任意一个字符。例如 [abc] 代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] | 匹配括号中任意一个字符,- 代表一个范围,例如 [a-z] |
[^] | 逻辑非,代表匹配不是括号内的一个字符 |
# Bash 中其他特殊符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如 '$' 和 '`'(反引号)都没有特殊含义 |
"" | 双引号。在双引号中部分特殊符号没有特殊含义,但是 '$' '`' 和 '' 是例外 |
`` | 反引号。反引号扩起来的内容是系统命令,在 Bash 中会先执行它。和 $() 作用一样,更推荐使用 $() |
$() | 和反引号作用一样,用来引用系统命令 |
# | 在 Shell 脚本中,# 开头的代表注释 |
$ | 用于调用变量的值。例如需要调用变量 name 的值时,需要用 $name 的方式得到变量的值 |
\ | 转义符,跟在 \ 之后的特殊符号将失去特殊意义,变为普通字符 |
# 定义 test 变量
test=123
echo test # test
echo $test # 123
echo '$test' # test 当作字符串输出
echo "$test" # 123 当作变量输出
aa=`ls` # aa 拿到的是系统命令 ls 执行后的结果
echo $aa
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10