http://c.biancheng.net/cpp/shell/
Shell是什么?
- 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序
- 还是一个功能强大的变成语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令
Shell的分类
Bourne Shell
,也称为B Shell
,1979年起Unix就开始使用它,主文件名为sh
C Shell
,主要是BSD版的Unix系统中使用,因其语法和C语言相类似而得名
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。前者主要包括sh, ksh, Bash, psh
,后者主要包括csh, tcsh
。
Linux的标准Shell是Bash
!Bash
和sh
是相互兼容的。通过执行echo $SHELL
就可以看到当前系统支持的哪种Shell
Linux支持的shell
vi /etc/shells
可以看到当前Linux支持的所有Shell
sh
就从Bash
进入到了sh
exit
退出当前Shell
使用bash
命令可以在已有的Bash下创建一个子Shell,同样使用exit
退出,调用和退出都是一级一级连贯的
后续课程会讲自己当前所处的shell是什么
查看与设定别名
alias
查看系统中所有的命令别名
alias 别名='原命令'
设定命令的别名
如alias rm='rm -i'
或者alias ll='ls -l'
相当于设置快捷命令,只不过是临时生效的
别名永久生效与删除别名
vi ~/.bashrc
写入环境变量配置文件
unalias
临时删除别名
命令生效顺序
常用快捷键
快捷键 | 含义 |
---|---|
ctrl+c | 强制终止当前命令 |
ctrl+l | 清屏 |
ctrl+a | 光标移动到命令行首 |
ctrl+e | 光标移动到命令行尾 |
ctrl+u | 光标所在位置删除到行首 |
ctrl+z | 把命令放入后台 |
ctrl+r | 在历史命令中搜索 |
历史命令
history 【选项】【历史命令保存文件】
选项:
-c
清空历史命令
-w
把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile
中进行修改HISTSIZE=1000
历史命令的调用
- 使用
上下箭头
调用以前的历史命令 - 使用
!n
重复执行第n条命令 - 使用
!!
重复执行上一条命令 - 使用
!字串
重复执行最后一条以该字串开头的命令
命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能我们只要在输入命令或文件时,按Tab
键就会自动进行补全
输出重定向
标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stdeer | 2 | 标准错误输出 |
输出重定向
如ipconfig > ~/desktop/test.log
,将内容保存在日志文件中
只要命令有输出就能重定向到文件中
特别注意,错误输出大于号和文件之间不能有空格!!!
正确和错误输出同时保存
3和4作用是一样的!推荐3,4,5!
特别这个文件/dev/null
,被称为『黑洞』,如果把命令重定向到这儿,系统就直接抛弃了
输入重定向
wc【选项】【文件名】
选项:
-c
统计字节数
-w
统计单词数
-l
统计行数
这里首先引入这个例子——wc < test.log
,wc
命令原本的输入是键盘,现在重新定向为文件,当然,其实不需要<
另外一个例子是——wc << ddy
,它会要求你不断输入,知道再遇到ddy
,就会停止并做相关统计,实际工作中基本不会用到
多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1 && 命令2 | 逻辑与,命令1正确执行才会执行命令2,命令1不正确执行,则命令2不会执行 |
shift+\shift+\ | 命令1 shift+\shift+\ 命令2 | 逻辑或,当命令1执行不正确,则命令2才会执行,当命令1正确执行,则命令2不会执行 |
*其中,shift+\
意味着|
例如:date ; tar -zcvf etc.tar.gz /etc ; date
可以计算中间打包压缩命令执行的耗时
再如,ls && echo yes || echo no
,第一个命令正确执行,输出yes,错误执行,输出no
管道符
命令格式:命令1 | 命令2
,有一定的编程思想在里面 命令1的正确输出作为命令2的操作对象,和逻辑与不一样
例子:
ls -l /etc | more
代表将ls -l /etc
的输出分屏显示netstat -an | grep ESTABLISHED
代表搜索netstat -an
输出中带有ESTABLISHED的行
如果再变成netstat -an | grep ESTABLISHED | wc -l
,此为多管道符命令,代表到最后统计带有ESTABLISHED的行的数目,即可看出服务器上连接了多少人- 如果原本使用
cat
输出的内容中有很多重复,可在后面加上|uniq
去重
通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如[abc]代表一定匹配一个字符,或者a或者b或者c |
[-] | 匹配中括号中任意一个字符,-代表一个范围。例如,[a-z]代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如[^0-9]代表匹配一个不是数字的字符 |
Bash中其他特殊符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如"$"和"`"(反引号)都没有特殊含义 |
"" | 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,拥有"调用变量的值"、"引用命令"和"转义符"的特殊含义 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号一样,用来引用系统命令 |
# | 在Shell脚本中,#开头的行代表注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变味普通字符。如\$将输出"$"符号,而不当作是变量引用 |
shell例子见/shell/shell.example
shell脚本就可以当做命令使用