编程基础 - 初识shell

编程基础 - 初识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”
编程基础 - 初识shell_第1张图片

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 [email protected]

如果你是第一次这么联系,会问你真的要建立联系吗?回答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 ]
	do
		let sum=$sum+$i
		let i=$i+1
	done
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的时候。
  • dodone是界定循环体的边界的固定写法。do就是做的意思,done是做完的意思。
  • echo 英文意思回声,就是你做完了给个回信哈~ 它就会把结果sum变量仓库里的东西显示在屏幕上。
  • 如果你想照着试试,请注意用英文输入法且格式要严格和笔者相同,主要指字符间的空格。

好了,不用太在意上面的东西,会有章节专门讲编程语法、和专业名词的。这里只是演示shell的工作方式,看个热闹有点概念就行,笔者把它写在路由器上了:
编程基础 - 初识shell_第2张图片
下面就是shell的执行结果:
编程基础 - 初识shell_第3张图片

  • 第一行是笔者用了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++) 写法都是没有的,估计是不能给数组赋值。但基本的迭代功能是有的,有图为证:
编程基础 - 初识shell_第4张图片

总的来说,如果需要编写更加复杂的脚本或需要使用更多的内置命令和特性,建议使用 bash 命令。如果只需要编写简单的脚本或需要遵循 POSIX 标准,可以使用 sh 命令。这部分对路由用户没有太大实际意义,了解一下即可,sh写上万行的脚本也不少见(实践篇中会有提到)。


总结

本章我们初步认识了shell,真的就是一聊天机器人~ 就是跟她聊天要遵守她的语法规则。

返回专栏目录 <<<


  1. 计算机系统有65535个端口,某些端口约定俗成分配给了某种服务用,比如80端口给了http,443给了https,22就是给ssh用的。所以不用加端口即可使用,如果不是标准22端口就要加参数ssh [email protected] -p 2222 ↩︎

你可能感兴趣的:(linux,智能路由器,shell,编程,运维)