MissingSemester(1):初识Shell以及Bash
MissingSemester(1):初识Shell以及Bash
概述:Shell是什么
如今的计算机有着多种多样的交互接口让我们可以进行指令的的输入,但是它们也从根本上限制了您的操作方式——你不能点击一个不存在的按钮或者是用语音输入一个还没有被录入的指令。 为了充分利用计算机的能力,我们不得不回到最根本的方式,使用文字接口:Shell
Shell的核心功能是一样的:它允许你执行程序,输入并获取某种半结构化的输出
接下来我们会使用Bourne Again SHell,简称bash.以Linux为例,我们按下ctrl+alt+T来打开它
初步使用Shell
shell的接口会告诉你主机名和当前的工作目录(位置)
另外,如果当前的输入框是以$
开头,则是表面您现在的身份还不是root用户
在此时,我们可以输入命令并被shell解析,比如:
一些命令与操作
1 | 在这里,我们的程序就是```echo```,而执行的参数是"hello" |
更完整的列表可以参考:https://www.tldp.org/LDP/abs/html/special-chars.html
命令通常使用 STDOUT来返回输出值,使用STDERR 来返回错误及错误码,便于脚本以更加友好的方式报告错误。 返回码或退出状态是脚本/命令之间交流执行状态的方式。返回值0表示正常执行,其他所有非0的返回值都表示有错误发生
流控制
退出码可以配合&&
和||
操作符来使用,进行对应的条件判断
同一行的多个命令可以使用;
来分割
程序true的返回码一直为0;程序false的返回码永远是1
获取命令的输出/命令替换
当您通过
$(CMD)
这样的方式来执行CMD这个命令时,它的输出结果会替换掉$(CMD)
例如我们使用for file in $(ls)
,shell首先将调用ls ,然后遍历得到的这些返回值
还有一个冷门的类似特性是 进程替换(process substitution), <( CMD ) 会执行 CMD 并将结果输出到一个临时文件中,并将 <( CMD ) 替换成临时文件名。这在我们希望返回值通过文件而不是STDIN传递时很有用。例如, diff <(ls foo) <(ls bar) 会显示文件夹 foo 和 bar 中文件的区别
在bash中进行比较时,尽量使用双方括号 [[ ]] 而不是单方括号 [ ],这样会降低犯错的几率,尽管这样并不能兼容
sh
通配符和批量展开
通配符:类似正则表达式的,我们在进行匹配的时候可以使用?
和*
来匹配一个或者任意个字符
花括号展开:{}
可以辅助展开一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便
查找文件
所有的类UNIX系统都包含一个名为find
的工具,它是 shell 上用于查找文件的绝佳工具。find
命令会递归地搜索符合条件的文件
例如:
除了列出所寻找的文件之外,find 还能对所有查找到的文件进行操作。这能极大地简化一些单调的任务
其它查找的程序
fd
就是一个更简单、更快速、更友好的程序,它可以用来作为find
的替代品,以模式PATTERN搜索的语法是fd PATTERN
locate
使用一个由updatedb负责更新的数据库,在大多数系统中 updatedb 都会通过 cron 每日更新。
find 和类似的工具可以通过别的属性比如文件大小、修改时间或是权限来查找文件,locate则只能通过文件名。
想要了解更多的话,可以点击:https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-each-other
查找代码
很多类UNIX的系统都提供了grep
命令,它是用于对输入文本进行匹配的通用工具
grep命令具有不少的option,比如:
-C:查找结果的上下文
-v:对结果进行反选
-R:递归地进入子目录并搜索
查找shell命令
history
可以访问shell中的历史命令,这个命令会打印出shell中被输入的命令的记录;配合上grep
,我们就可以对命令进行搜索,比如:history | grep find
会打印包含find子串的命令
对于大多数的shell来说,您可以使用 Ctrl+R 对命令历史记录进行回溯搜索。敲 Ctrl+R 后您可以输入子串来进行匹配,查找历史命令行。
小结
该部分只是稍微并很浅地总结了bash和shell的一些用法和属性,如果想要更好地使用它们,最好的办法莫过于亲自多用linux系统并查找手册与相关书籍