大家好,又见面了,我是你们的朋友全栈君。
诶诶欸?不是学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脚本
我们先来创建一个脚本文件,并写上在文件的里面写上这样的内容:
代码语言:javascript复制#!/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字段,从而修改其可保存的数量。历史命令可以通过以下方式来调用:
- 使用上下箭头调用以前的历史命令
- 使用
!n
重复执行第n条历史命令 - 使用
!!
重复执行上一条命令 - 使用
!字符
重复执行最后一条以该字符串开头的命令
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的学习。记得别忘了把准备工作做好哦。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124373.html原文链接:https://javaforall.cn