Shell指令说明
一开始设计 Unix 系统时,计算机与终端之间的连接速度很慢,因此采用非常简短的命令使用起来速度更快
。不仅 shell 是这样,Unix 系统的其他部分(例如 C 编程语言)也是这样。
打印
echo
,打印指令,同 JS 的 console.log
和 Python 的 print
。单词前面的 $
符号表示它是一个 shell 变量。
echo $COLUMNS x $LINES
// 输出 终端的窗口大小
86 x 30
浏览目录
ls
(list-列表),打印出当前目录的内容。要列出另一个目录,ls 该目录的名称
,像 ls 和 cd 合起来的功能。.
用于指代当前目录,ls. 等同于 ls
。ls ~
主目录,无论变更到哪个目录,都将列出主目录的内容。
cd
,更改 shell 正在查看的目录,在更改到特定的目录后,如果想返回父目录,可以使用特殊目录名称 cd ..
。
;
,分号可以让你在同一行写两个命令,shell 将按顺序来运行它们。
pwd
,当前工作目录。
参数和选项
还包括支持一些额外行为或特殊功能的选项、标记或参数。
-l
(long) 是 ls
的一个选项,可以将它与目录名称一起使用,它的作用是打印出一个更长更详细的文件列表(每个文件或目录的名称、文件上次修改日期和时间、文件的大小等)。
Shell 可以将文件名与文件类型相匹配,例如想要列出 Documents 目录中的所有 PDF 文档,方法是添加一个星号 ls -l Documents/*.pdf
。Shell 会将星号转变为名称匹配该文件类型的所有文件列表。列出所有名称以 bear 开头的文件 ls bear*
。
整理文件
移动文件,例如我想创建子目录,组织下文件。在图形用户界面我们可能需要进行很多拖放和创建新文件夹的操作,但是在 Shell 中几个命令便可以搞定。
mkdir Documents/Books
,新建一个子目录 Documents/Books。 mv 'Documents/1911 Webster Dictionary.epub' Documents/Books/
,从哪儿来,到哪儿去。将 ePub 文件移动到目录中,逐个移动文件。
mv Document/*.epub Documents/Books
,通过星号移动多个相同类型的文件。
在 shell 中引用内容时,请始终使用直引号
。如果你输入到终端窗口中,将会获得相关内容。但是,如果从网页或文档中进行复制,一定要小心不是“弯引号”。弯引号在 shell 中不可行。
下载
curl
(see URL-查看网页)命令用来从网络下载文件,获取任何网页。但它的作用是向你显示网页的源代码。它会向我们显示一些 HTML,但实际上会将我们导航到别处。我们需要给 curl 添加一个选项 curl -L
,它表示遵循重定向。
...$ curl -l 'http://www.baidu.com'
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
curl
非常适合通过 URL 下载文件或页面。要使其写入文件而不是显示给终端,我们使用 -o
选项,后面再跟我们想要保存在其之下的文件名称 curl -L -o baidu.html 'http://www.baidu.com'
。
很多 URL 中都有特殊字符,例如 &
符号,它在 shell 中有特殊的含义。因此我始终将这些 URL 放在引号内,虽然这些示例没有引号也可行,但是有必要养成良好的习惯。
查看文件
cat
(concatenate-连接多个事物),cat dictionary.txt
它能读取文件并输出内容,它快速扫荡了终端的文件直接到达了末尾。
less
,它一次向我们展示文件的更少部分,less dictionary.txt
具体来说就是只会显示沾满一屏的文件内容。
删除内容
rm
(remove),删除文件 rm dictionary.txt
,shell 命令删除文件没有警告提示,它会直接删掉文件。当你不小心删掉重要文件,可以使用选项 -i
(interactive-交互)。rm -i dictionary.txt
在删除文件前询问你是否要进行删除。
rmdir
,删除目录 rmdir Documents
。
搜索和管道
除了查看、移动和删除文件外,我们还可以对文件做更多事情,以刚才的 dictionary.txt 文件为例,检查看某个单词是否在此字典中,乐意使用 grep
命令,它知道如何在文本文件中搜索具有特定内容的行 grep shell dictionary.txt
,它会读取文件并输出包含 shell 的所有行,但这样输出的行太多。我们可以使用管道命令 grep shell dictionary.txt | less
对 文件执行 grep shell 命令,然后传递给 less 程序,它会一次一页将这些行显示给终端。
grep
命令也可以处理来自另一个程序的输入,例如使用 curl 从网络中提取文件,并立即对它使用 grep 命令来获取符合特定模式的内容,而无需先将它保存到一个文件。curl -L 'http://www.baidu.com' | grep baidu
,此 curl 命令的输出会作为输出传递给 grep 命令,而非从文件中进行 grep 读取。
还有 curl -L 'http://www.baidu.com' | grep baidu | wc -l
或 curl -L 'http://www.baidu.com' | grep -c baidu
用于计数。
Shell 和环境变量
shell 类似编程语言,就像 JS 或 Python 一样,它具有变量,不过有点不一样,在 shell 中每当你创建或修改一个变量只需要给它一个名称和一个等号,后面跟你想要的值。记住等号两边不能加空格,想引用这个变量时只需用 $ 符号后跟名称即可。
...$ number='one two three'
echo $number
one two three
Shell 中实际上有两种不同类型的变量,一种叫 Shell 变量
,之前的 LINES
和 COLUMNS
变量是 Shell 程序本身的内部变量
。另一种叫做环境变量
,它是与在 Shell 中运行的程序共享的变量,一个非常重要的环境变量 PATH
,它会告诉系统你的程序文件的位置
Shell资源