编程基础 - 初识shell
返回序言及专栏目录
文章目录
- 编程基础 - 初识shell
- 前言
- 一、Linux的路径
- 1、绝对路径
- 2、相对路径
- 3、特殊路径
- 二、交互式工作
- 1、先联系上shell
- 2、交互式命令
- 三、执行脚本
- 四、sh和bash的区别
- 总结
前言
shell是Linux内核外的一层壳,是用户与Linux交互的桥梁。也可以叫他命令解释器,用户输入的命令由它告诉内核要做什么,内核是负责对硬件进行管理与操作的,我们用户无法直接告诉内核我们要做什么,所以要通过shell和内核进行沟通,从而达到使用计算机资源的目的。
shell有两种工作方式,交互式命令解释:用户输入命令,它立即执行给出结果。另一种就是解释程序脚本,用户给出一个已编写好的由多个命令按一定逻辑组织好的文本文件。shell读取并执行这个程序脚本,按设计好的程序运行,就是我们所说的真正意义上的编程。从这个角度讲,shell是一种解释型的编程语言。它与C/C++不同,不需要编译。
编译和解释两类编程语言都是主流,通常编译型语言运行时更有效率,因为它事先已经编译成二进制代码,cpu能够直接认识,c/c++就是编译型语言的代表。而解释型语言更容易编写调试,通常都有交互式命令解释工作方式,所见即所得,正因为由解释器负责给cpu翻译,自然在效率上就要差很多,python、shell、javascript都是此类语言的知名代表。
对于现代计算机而言,运行速度已经不是c/c++语言刚诞生的时代可以想像的了,当时的巨型计算机还不如现在丢在垃圾堆里的路由器。除了底层开发,运行效率已经不是编程要考虑的首要问题了,所以两类编程语言都各自有很广的应用方向。如WEB App就大量使用javascript和python、运维工作那就是shell最方便了,python也很好(shell、python这两种语言,Linux通常自带的)。
一、Linux的路径
什么叫路径?就是用来表示位置的方法。windows中我们把文件存在d
盘的我的文档
这个文件夹,这就是路径,在windows中写作d:\我的文档
。在Linux也是类似的情况,不过Linux没有d:
盘这个概念,它当然也分区,也可以有多个硬盘。但Linux一切皆文件,某个硬盘那是一个文件,某个分区也是一个文件。所以在路径表示这点上它比windows简单,虽然让硬盘工作要麻烦一些。
简单概括的说:Linux有三种路径表示方法
1、绝对路径
以/
根目录(只有一个根目录)为基点,就可以表示任意一个文件夹(也叫目录)的路径了,上面所说的d盘的我的文档
,在Linux中可能会是这样的:
# shell的杠与windows是相反的。windows的杠叫反斜杠,shell这个叫斜杠。
/mnt/sda2/我的文档
2、相对路径
就是我们要表示的位置相对于当前所在位置的表示方法,windows中也有一样的写法,假设Windows中现在位于d盘,那么可以写成./我的文档
,也就是说./
表示所在文件夹。../
表示上一级目录。Linux和windows一样的表示方法:假设我们目前位于/mnt
目录
# windows用于表示相对路径的斜杠又和Linux一样了 假设我们目前位于`/mnt`目录
./sda2/我的文档
# 根目录就可以表示成 假设我们目前位于`/mnt`目录
../
3、特殊路径
windows有很多特殊路径,用于表示用户文件夹的是:%USERPROFILE%
。Linux只有一个特殊路径,~
表示用户目录。另外,Linux是大小写敏感的,Admin
不等于admin
。
我们用个实例演示一下:ls
命令用于列出文件下的可见文件,cd
和windows一样用于改变当前所在目录,cat
用于读取文件内容。笔者在/tmp/home/root/
目录下建了一个文件夹叫test,在test文件夹下建了一个myfile.txt的文件,在myfile.txt中写了一句话“this is a test”
ls /tmp/home/root/test/ # 命令要求列出tmp文件夹下home下root下test目录内的可见文件
myfile.txt
cat /tmp/home/root/test/myfile.txt # 命令要求读出myfile.txt文件内容
this is a test
cd /tmp # 进入/tmp目录
cd ./home/ # 进入当前目录下的home目录
cd ../ # 进入当前目录的上一级目录
cd ./home/root/test/ # 进入当前目录下的home目录下root下test目录
cd ../../ # 进入当前目录的上两级目录,就是home目录
cd ~ # 进入home下的root目录,因为我们就是root用户
二、交互式工作
这是一种类似于我们通过聊天软件与人文字聊天的感觉,特别的它还挺听话的,只要你说的不是shell不懂的外语,当然它暂时不能和你奔现~ 而且她一般没有废话,只管埋头干活,挺老实的。笔者暂时充当人类语言与shell语言的翻译,给读者演示一下如何与shell美眉交谈:
1、先联系上shell
就是找个聊天软件,然后呼叫美眉嘛,大家都很熟的。比较知名的聊天软件有windows自带PowerShell、windows软件putty、Linux和Mac自带的bash、zsh(就是终端),都很简单好用。记得呼叫端口默认是221
# 就是:用户名@服务器ip地址
ssh admin@192.168.2.1
如果你是第一次这么联系,会问你真的要建立联系吗?回答y/n,如果是,你接着输入服务器的密码,就可以登陆和路由器或服务器的shell建立联系了。
- 如上图就是刚登陆的样子,这其中第一行是路由器的系统和时间信息,如果是linux服务器就是linux的信息,无非就是多点字少点字的问题。
- 第二行是提示行,它显示不少信息:admin是登陆用户,@后面是路由主机名。冒号后面是我们的登陆路径,这个目录其实就是上文提到的~家目录,每个用户登陆都会到自己的
~
目录。最后的#表示这个是超级用户,如果不是超级用户通常会显示$(各Linux系统有差别)。
2、交互式命令
下面我们来看看如何与shell交谈,等到混熟了,我们可以给shell写脚本,让它执行。就像聊天聊熟了就给人发文件一样。发个文件给它,它就替你干活了哦~
让shell去/tmp目录、看看/tmp/home/root/test目录下有什么。为了美观,没有必要的情况下笔者把admin@RT-AC3100-88B0:/tmp/home/root#
这个路径提示信息删除了。
cd /tmp
ls -a /tmp/home/root/test # -a 表示列出所有文件,包括隐藏文件
./ ../ myfile.txt
和windows一样有./
、../
,用于表示自己当前目录和上一级目录。让shell返回上一级目录:
cd .. # cd ../ 也是可以的
# 显示当前路径
pwd
/ # 已经回到根目录了
进入/tmp/home/root/test目录,并查看myfile.txt的内容
cd /tmp/home/root/test && cat myfile.txt
# 运行结果如下,可以看到由/根目录,切换到了/tmp/home/root/test并且显示了文件
# 可以用&&连接两个命令,&&表示和的意思 以下没有删除路径提示信息
admin@RT-AC3100-88B0:/# cd /tmp/home/root/test && cat myfile.txt
this is a test
admin@RT-AC3100-88B0:/tmp/home/root/test#
三、执行脚本
好了,通过上面的示例,我们已经初步认识了shell美眉。很容易相处的嘛~ 我们可以给shell美眉写信了,它看懂了就会帮我们做事。小时候高斯同学告诉我们说:从1到100,这100个整数加起来的结果是5050,我们一直没算清楚,就请shell美眉帮我算一下:
#!/bin/sh
i=0
sum=0
while [ $i -lt 101 ]dolet sum=$sum+$ilet i=$i+1done
echo $sum
看不懂没关系,没有学过编程的人,一上手就要看懂这个脚本是不太可能的。这里只是演示脚本的工作方式,有这种脚本编程的概念即可,后面也会有详细的解释。当然有其它编程语言基础的人看这个就简单了。
- 第一句
#!/bin/sh
表示所用解释器。固定写法(/bin/sh是解释器的路径,通常不会在其它路径),表示以本程序用sh解释器。 i=0
定义了一个变量i
,你也可以用其它字母,但只能用大小写字母,_
、和数字,且数字不能是第一个字符。用多个字符组合当然也可以,如下一行的sum
sum=0
定义了变量sum,变量我们可以理解成一个存储各种数据(字母、数字等)的地方,这个地方就叫我们定义的名字,本例中就在sum和i中存储了0。这也叫初始化变量,就是给变量仓库放一个初始值把仓库占了先。-lt
是比较运算的小于,二个数比大小,幼儿园我认真学了的。笔者猜测是little的简写。$
是引用符,用于取变量值,它也经常用于取运算结果,是shell的固定写法。while [ $i -lt 101 ]
while英文意思是当…时候,那么这句话就是:当i号仓库放的值小于101的时候。do
和done
是界定循环体的边界的固定写法。do就是做的意思,done是做完的意思。echo
英文意思回声,就是你做完了给个回信哈~ 它就会把结果sum
变量仓库里的东西显示在屏幕上。- 如果你想照着试试,请注意用英文输入法且格式要严格和笔者相同,主要指字符间的空格。
好了,不用太在意上面的东西,会有章节专门讲编程语法、和专业名词的。这里只是演示shell的工作方式,看个热闹有点概念就行,笔者把它写在路由器上了:
下面就是shell的执行结果:
- 第一行是笔者用了Linux的
vi
编辑器,把脚本写好保存。vi
会弹出一个编辑框,和记事本差不多,编辑完了保存后vi
就消失了~ - 第二行是给笔者刚写的脚本执行权限,权限问题后面讲。
- 第三行是运行这个脚本,
./
是目录,虽然就在当前目录下,也不能省的,原理后面讲。 - 第四行是脚本执行后的结果,由
echo $sum
这个命令输出。
四、sh和bash的区别
bash 和 sh 命令都是Linux/Unix类系统上的 shell 解释器。但它们还是有些区别的:
bash 是 Bourne-Again shell 的缩写,是基于 Bourne shell 的改进版本,支持更多的功能和扩展。sh 命令是指 POSIX shell,是与 POSIX 标准兼容的 Unix shell。说人话就是:sh是标准版,bash是扩展版本。
至于有些文章说的什么没有命令补全、没有数组功能。经笔者实测,命令补全肯定有的,这和啥解释器没有关系,至于数组功能确实是缺失大部分的。比如数组中的[@]
、[*]
、#
、{1..100}
、for (i=1;i<101;i++)
写法都是没有的,估计是不能给数组赋值。但基本的迭代功能是有的,有图为证:
总的来说,如果需要编写更加复杂的脚本或需要使用更多的内置命令和特性,建议使用 bash 命令。如果只需要编写简单的脚本或需要遵循 POSIX 标准,可以使用 sh 命令。这部分对路由用户没有太大实际意义,了解一下即可,sh写上万行的脚本也不少见(实践篇中会有提到)。
总结
本章我们初步认识了shell,真的就是一聊天机器人~ 就是跟她聊天要遵守她的语法规则。
返回专栏目录 <<<
计算机系统有65535个端口,某些端口约定俗成分配给了某种服务用,比如80端口给了http,443给了https,22就是给ssh用的。所以不用加端口即可使用,如果不是标准22端口就要加参数
ssh admin@192.168.2.1 -p 2222
↩︎