一.Shell入门
1.什么是Shell?
Shell就是一个用户跟操作系统之间的一个命令解释器。如通过echo $SHELL
查看当前用的SHELL版本。
2.echo输出方式
echo [选项] [输出内容]
- 选项:
-e
支持反斜线控制的字符转换。如\a\n\b...
- 选项:
3.第一个Shell脚本
-
后缀名.sh(如:
first_shell.sh
) -
第一行标注
#!/bin/bash
(固定格式) -
通常第二行注释
#
当前是什么shell脚本,第三行注释这个脚本是干什么用的,第四行注释这个脚本的作者 -
写具体的操作信息(echo表示打印的意思)——相当于将命令写到脚本里
-
实例代码
#!/bin/bash #Filename:first_shell.sh #auto echo hello world #by authors Jack 2018 echo "Hello world"
-
直接执行shell脚本需要修改文件的执行权限,且需要切换到管理员用户
chmod o+x first_shell.sh
-
如果用bash自己的环境去执行脚本,则不需要修改对应的执行权限了
bash first_shell.sh
-
执行后命令行打印
Hello world
二.Bash的基本功能
1.别名与快捷键
- alias查看系统当中已经定义的别名
alias 别名='原命令'
定义别名(重启不生效),如alias vi='vim'
以后每次敲vi都会执行vim- 别名永久生效
vi ~/.bashrc
将其写入环境变量配置文件中,并执行source ~/.bashrc
保存配置文件的修改 unalias 别名
删除别名(重启不生效)- 命令生效顺序
- 第一顺位执行用绝对路径或相对路径执行的命令(直接用路径执行shell脚本如
./first_shell.sh
) - 第二顺位执行别名(在自定义的别名中找)
- 第三顺位执行Bash的内部命令(在Bash自己的命令中查找如rm等)
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令(在PATH路径下查找)
- 故由上可知,如果别名和内部命令相同,则会执行别名而覆盖掉原有内部命令
- 第一顺位执行用绝对路径或相对路径执行的命令(直接用路径执行shell脚本如
- 快捷键
ctrl+c
强制终止当前命令ctrl+l
清屏ctrl+a
光标移动到命令行首ctrl+e
光标移动到命令行尾ctrl+u
光标所在位置删除到行首ctrl+z
把命令放入后台ctrl+r
在历史命令中搜索
2.历史命令
将操作过的命令存到系统中,以后需要时还可以再次执行
history [选项][历史命令保存文件]
- 选项
-c
清空历史命令-w
把缓存中的历史命令写入历史命令保存文件~/.bash_history
- 选项
- 历史命令默认会保存1000条,可以在环境变量配置文件
/etc/profile
修改其中的HISTSIZE=1000
- 历史命令的调用
- 使用上下箭头调用以前的历史命令
- 使用
"!n"
重复执行第n条历史命令 - 使用
"!!"
重复执行上一条命令 - 使用
"!子串"
重复执行最后一条以该子串开头的命令
- 命令与文件补全:在Bash中,命令与文件补全是非常方便与常用的功能,我们只要再输入命令或文件时,按"Tab"键就会自动进行补全
3.输出、输入重定向
-
标准输入输出
设备 设备文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/sdtout 1 标准输出 显示器 /dev/sdterr 2 标准错误输出 -
输出重定向类型、符号与作用**【注意:错误输出的大于号左右两侧不能有空格】**
类型 符号 作用 标准输出重定向 命令 > 文件 以覆盖的方式,把命名的正确输出输出到指定的文件或设备当中 标准输出重定向 命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 标准错误输出重定向 错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中 正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 正确输出和错误输出同时保存 命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 正确输出和错误输出同时保存 命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 正确输出和错误输出同时保存 命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 正确输出和错误输出同时保存 命令 >>文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中 ls &>/dev/null
则意味着将使用ls命令的结果放到Linux定义的黑洞(可以理解成垃圾站)中,常用于在脚本中不记录某些内容
-
wc [选项] [文件名]
获得输入的单词数目,行数和字节数- 选项
-c
统计字节数-w
统计单词数-l
统计行数
- 使用时输入wc命令,之后随意输出内容(以空格分割),按
ctrl+d
则会返回总行数,单词数和字节数
- 选项
-
输入重定向
- 命令
<
文件把文件作为命令的输入。如wc < access.log
结果为9 13 147
则表示有9行13个单词147字节 - 命令
<<
标识符,当输入wc << 标识符
,之后输入一些内容,之后再输入标识符时,则会统计两个标识符中间的行数、单词数和字节数
- 命令
4.管道符
-
多命令顺序执行
多命令执行符 格式 作用 ; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系(不管中间命令是否报错,其余命令仍正常执行) && 命令1&&命令2 逻辑与。当命令1正确执行,则命令2才会执行。当命令1执行不正确,则命令2不会执行。 || 命令1||命令2 逻辑或。当命令1执行不正确,则命令2才会执行。当命令1正确执行,则命令2不会执行。 #eg. ls && echo yes || echo no
-
管道符
- 命令格式:
命令1 | 命令2
- 命令1的正确输出结果作为命令2的操作对象;命令1如果没有正确输出,则不会执行命令2
ls -l /etc | more
- 命令格式:
-
注意:管道符和命令执行符不同,命令执行符只会控制是否执行,但管道符又相互之间操作对象的传递
-
netstat -an
查看所有网络连接命令#eg.查看当前服务器连接了多少人 netstat -an | grep ESTABLISHED | wc -l
5.通配符
- 通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z] 代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9] 代表匹配一个不是数字的字符 |
- Bash中其他特殊符号
符号 | 作用 |
---|---|
‘’ | 单引号。在单引号中所有的特殊符号,如"$“和”`"(反引号)都没有特殊含义 |
“” | 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、"`“和”\"是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令 |
# | 在Shell脚本中,#开头的行代表注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$ 将输出"$"符号,而不当做时变量引用 |
#举例
a=`ls`
b=$(ls)
echo $a#打印当前目录
echo $b#打印当前目录
echo ls#打印 ls
echo \$b#打印$b