1. Shell介绍
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2. 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。
Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3. Linux支持的Shell
/etc/shells(该文件中列有当前Linux系统支持的Shell)
1、echo输出命令
echo [选项] [输出内容]
选项:
- -e:支持反斜线控制的字符转换
echo -e "hell\bo"
# 删除\b左侧字符
echo -e "h\te\tl\n\to"
# 制表符与换行符
echo -e "\x68\t\x65"
# 按照十六进制ASCII码也可以输出
# 此外,echo命令还可以设置字体颜色等。
2. 第一个脚本
执行vi hello.sh
脚本中的内容(第一句不是注释,是不能省略的,其他#号的句子代表注释):
#!/bin/bash
#The first program
echo -e "\3[1;34m Helloworld!\e[0m"
3. 脚本执行
赋予执行权限,直接运行:
chmod 755 hello.sh
./hello.sh(或者用绝对路径来调用)
通过Bash调用执行脚本
bash hello.sh
1. 命令别名与快捷键
alias
# 查看系统中所有的命令别名
alias 别名='原命令'
#设定命令别名,该设定在下一次重启失效
alias ls='ls --color=never'
vi ~/.bashrc
# 写入环境变量配置文件,修改该文件后重新登录永久生效。
source .bashrc
# 让环境变量直接生效
unalias 别名
# (临时)删除别名,下次重启时,如果配置文件中还有该别名,则该别名仍然生效
第一顺位执行用绝对路径或相对路径执行的命令。
第二顺位执行别名。
第三顺位执行Bash的内部命令。
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。(用echo $PATH查询目录)
ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+a 光标移动到命令行首
ctrl+e 光标移动到命令行尾
ctrl+u 从光标所在位置删除到行首
ctrl+z 把命令放入后台(不要用该命令来终止命令)
ctrl+r 在历史命令中搜索
2. 历史记录
1.历史命令
history [选项] [历史命令保存文件]
选项;
- -c: 清空历史命令
- -w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令默认保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用"!n"重复执行第n条历史命令
- 使用"!!"重复执行上一条命令
- 使用"!字串"重复执行最后一条以该字串开头的命令
2.命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab”键就会自动进行补全。
3. 输出重定向
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
2. 输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。 |
标准输出重定向 | 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 |
这种输出重定向需要明确知道当前命令是否为错误命令,所以实际应用很少。
类型 | 符号 | 作用 |
---|---|---|
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 |
命令 >> 文件 2>&1(若正确输出,直接写入文件;若错误输出,把错误结果写入正确结果中,然后再将结果写入文件中) | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令 &> 文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令>>文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中。 |
ls &>/dev/null
# 相当于将命令丢入黑洞中,该命令结果会完全消失,用于不需要显示命令结果(过程)的情况。
3.输入重定向
[root@localhost ~]# wc [选项][文件名]
选项:
-c: 统计字节数
-w: 统计单词书
-l: 统计行数
命令 < 文件:把文件作为命令的输入
如: wc < access.log
命令 << 标识符
如: wc << ddy
>jagja
>hgo
>ddy(标识符)
- 标识符把标识符之间的内容作为命令的输入
4. 多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系(前面的命令报错不会影响后面的命令执行) |
&& | 命令1 && 命令2 | 逻辑与,当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行 |
|| | 命令1||命令2 | 逻辑或,当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行 |
date ; tar -zcvf etc.tar.gz /etc ; date
# 查看压缩使用时间
ls && echo yes || echo no
# 若ls正确执行,则打印yes;若ls命令错误,则打印no(使脚本判断更简单)
lssjgajoa || echo no && yes
# 根据逻辑,当第一条命令错误,这三条命令都会执行,因此用来判断正确还是错误时,应该逻辑与在前,逻辑或在后
命令格式:
[root@localhost ~]# 命令1 | 命令2
# 命令1的正确输出作为命令2的操作对象(因此,命令1若报错, 命令2不会执行),
# 命令2必须要可以操作命令1的输出结果
举例:more 文件名: 分屏显示,用于查看文件当中的内容(不能直接查看命令的执行结果)
[root@localhost ~]# ls -l /etc > abc
[root@localhost ~]# more abc
# 首先将ls的结果通过输出重定向保存在文件abc中,再通过more命令来查看这个文件,
# 这样就可以分屏显示命令的结果。(使用ls时,当该目录文件非常多,而命令窗口显示
# 的行数有限,可能前面的一些显示就无法看到了)
[root@localhost ~]# ls -l /etc | more
# 将ls的结果作为more的操作对象
netstat -an | grep ESTABLISHED
# 用于查看端口情况,查看连接状态为ESTABLISHED的端口情况
netstat -an | grep ESTABLISHED | wc -l
# 查看连接状态为ESTABLISHED的端口情况并统计有多少个端口连接
5. Shell中特殊符号
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者匹配a ,或者匹配b,或者匹配c。 |
[-] | 匹配括号中的任意一个字符, -代表一个范围。例如:[a-z]代表匹配一个小写字母。 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符。 |
符号 | 作用 |
---|---|
” | 单引号。在单引号中所有的特殊符号,如’$’和’`’(反引号)都没有特殊含义。 |
“” | 双引号。在双引号中特殊符号都没有特殊含义,但是”$”和”`”和”\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊函数。 |
“ | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
# | 在Shell脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用。 |
# 将命令赋给变量aa,并打印命令的结果
aa=$(ls)
echo "$aa"