《前端运维》一、Linux基础--03Shell基础及补充

诶诶欸?不是学Linux么?怎么要讲shell了?shell是啥?啥是shell?

别急,我们先简单了解下shell是什么。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。而我们日常中所说的Shell,通常是指Shell脚本,但是你一定要注意的是Shell和Shell Script并不是一回事。

Shell是解释执行的脚本语言,在Shell中可以直接使用Linux系统命令。诶?脚本语言?javascript不也是脚本语言?是的。Shell和javascript都是脚本语言。理论上讲,如果Linux能理解javascript,那么javascript完全可以像Shell一样在Linux上运行。换句话说,javascript代码可以在浏览器中运行,Shell可以在Linux中使用,它们所扮演的角色都是类似的,只不过运行的平台不同,道理是相通的。

OK,从现在起,所有的代码都是在本地编写,并通过FTP传到服务器上运行,如果你是Windows电脑,那么下载个XFTP软件使用即可,如果你是mac,请百度下如何传文件到服务器,这不是本文的重点,也不再赘述。其实mac的话,本地的terminal也可以运行linux命令,但是涉及到一些服务器文件的时候,可能就不行了。

首先,我们创建一个本地的文件,后缀名其实是无所谓的,还记得不,我们之前说过,linux是不会根据后缀名来区分文件类型的,那我们加上后缀名一方面是为了见名知意,另一方面是为了其他平台的兼容(这个是我编的)。

由于Linux文件不区分类型,所以我们要在写shell脚本的文件里面写上:#!/bin/bash。就像Html文件开头的<!DOCTYPE html>一样,是为了告诉系统,这个文件用什么程序来解释该文件的内容。

ps:bash是什么意思呢?其实就是Linux的shell的种类,比如常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

等等。所以,这回你知道了,bash是什么意思,就是shell的一个种类而已。

 

一、第一个shell脚本

我们先来创建一个脚本文件,并写上在文件的里面写上这样的内容:

#!/bin/bash
echo 'Hello World!'

然后,根据我们之前所说,通过FTP把这个文件传到/demo目录下,然后通过sh命令执行脚本,激动人心的时刻到来了~

完美!这里有一点要注意的是,通过sh命令调用shell脚本文件,可以不用在第一行指定解释器信息,因为实际上,你的命令已经决定了用啥解释器。但是作为可执行文件执行的时候,一定要加的。所以无论啥场景,你加上肯定没问题。

另外一种,可执行文件的方式:

这里要注意的是,文件的地址一定要写相对路径的形式,因为如果你只写test1.sh,系统会去PATH里去找,显而易见是找不到的。

我们已经完成了脚本的运行。下面,我们来学习一些有关于Shell语言的一些基本内容。

 

二、补充

2.1、echo

输出内容到标准输出。上面第一部分已经使用过了,这里不再重复:

  • -e,激活转义字符。

2.2、alias,alias [别名]=[指令名称]

别名,简单来说,类似于npm包管理的package.json中的script,在一个简短的命令和复杂的命令间建立联系,可以让命令的使用更便捷。该命令可以创建临时生效的别名。如果要永久生效,需要修改~/.bashrc文件。也可以通过直接执行alias命令,查看当前设置别名的命令有哪些。

2.3、history

可以查询执行过的命令。选项-c 会清空历史命令,选项-w,可以把缓存中的历史命令写入历史命令保存文件(~/.bash_history),默认情况下,历史命令会保存1000条,可以修改/etc/profile文件中的HISSIZE字段,从而修改其可保存的数量。历史命令可以通过以下方式来调用:

  1. 使用上下箭头调用以前的历史命令
  2. 使用 !n 重复执行第n条历史命令
  3. 使用 !! 重复执行上一条命令
  4. 使用 !字符 重复执行最后一条以该字符串开头的命令

2.4、命令的生效顺序

  • 绝对路径或者相对路径
  • 别名
  • bash内部命令
  • 按照$PATH环境变量定义的目录查找顺序找到的第一个命令

2.5、命令快捷键

命令含义
ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+a 光标移动到命令行首
ctrl+e 光标移动到命令行尾
ctrl+u 从光标所在的位置删除到行首


2.6、标准输入输出

设备设备文件名文件描述符类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

 

2.6.1、输出重定向

类型符号作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
标准输出重定向 命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中
错误输出重定向 命令>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误输出重定向 命令>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存 命令>文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令>文件 2>>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令&>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令&>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令>>文件1 2>文件2 以覆盖的方式,正确的输出追加到文件1中,把错误输出追加到文件2中

 

2.6.2、输入重定向

wc命令的功能为统计指定文件中的行数、字数、字节数, 并将统计结果显示输出。命令 < 文件,把文件做为命令的输入。

 

2.7、管道符 

就是“|”这个符号。使用方法是这样的:

  • 命令1|命令2

意思是命令1的正确输出会作为命令2的操作对象。

 

2.8、通配符

用来匹配目录或文件名,也就是说在操作文件的时候,支持下面的字符来匹配。

通配符作用
? 匹配一个任意字符
* 匹配0个或任意字符,也就是可以匹配任意内容
[] 匹配中括号中任意一个字符
[-] 匹配中括号中任意一个字符,-代表范围
[^] 匹配不是中括号中的一个字符

 

2.9、其他符号

符号作用
'' 单引号,在单引号中所有的特殊符号,如$和`都没有特殊含义
"" 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` \ 例外,拥有调用变量值,引用命令和转义的含义
 `` 反引号,扩起来的是系统命令
$() 和反引号一样
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值
\ 转义符号

 

 

今天内容比较散乱,主要作为承上启下的作用。而这篇文章也没写例子,主要是我觉得如果认真学习了前两篇内容,这篇的例子完全可以由你自己去尝试,就当做是一次作业吧。下一篇文章,我们正式进入Shell的学习。记得别忘了把准备工作做好哦。

posted @ 2021-05-22 23:01  Zaking  阅读(59)  评论(0编辑  收藏  举报