慕课网Linux 达人养成计划 I 学习笔记(五)

本文是教程第9章Shell基础的笔记。


第9章 Shell基础

9-1 shell概述

Shell是什么:是一种命令行解释器。它连接用户和内核(“翻译”)。另外,Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是一种脚本语言,可以直接调用Linux系统命令。
Shell的分类:

  1. Bourne Shell:从1979年起Unix就开始使用Bourne Shell(它不支持上下箭头查找历史输入命令);
  2. C Shell:主要在BSD版的Unix系统中使用,其语法与C语言像类似而得名;

Shell的主要语法类型包含有Bourne和C,其中,Bourne家族主要包括有:sh,ksh,Bash(Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell),psh,zsh;而C家族(主要是用Unix)主要包括:csh,tcsh。
注意:

  1. 使用 echo $SHELL命令可以查看当前使用的Shell语法;
  2. /etc/shells 文件记录当前系统所兼容的Shell类型;
9-2 脚本执行方式

echo命令:在Shell终端输出给定的内容。加上-e选项能识别特定的控制字符(类似于C++中的转义字符)。
注意:sh脚本开头的"#!/bin/bash"不能省略,它标称下面所写的脚本是Linux的标准脚本,此处的"#"也不是注释的意思。当脚本中单纯只有Shell语言的时候,不加这句代码可能不会报错,但是当脚本中出现Shell语言调用其它语言的时候,没有加上这句代码的话就会报错。
Shell脚本的执行方法(假设执行test.sh这个脚本文件):

  1. 赋予执行权限,直接运行:
  2. 通过Bash调用执行脚本:

本章接下来的内容是学习一些关于Linux的标准Shell——Bash的基本功能

9-3 别名与快捷键

命令别名:类似于人的小名。
查看系统现有的别名:alias
给命令赋别名:alias 别名=‘原命令’。EX:alias ls=‘ls --color=never’,其好处在于:

  • 可以给一些比较长的命令赋予别名;
  • 或者将一些书写不习惯的命令定义成习惯的写法。

注意:用上面的方法定义的别名在重启之后会失效,所以可以通过下面介绍的方法定义长期的别名:
修改 ~/.bashrc环境变量配置文件,在其中添加 alias 别名=‘原命令’ 即可以使别名永久生效。这里需要注意的是:

  1. ~/.bashrc文件知识针对当前home目录所对应的用户的,对其他用户无效;
  2. ~/.bashrc修改后需要重启才能生效,或者可以使用source ~/.bashrc命令使其生效。

删除别名:unlias。EX:unalias ls=‘ls --color=never’。与alias一样,它只是临时删除,想用就删除得在~/.bashrc文件中进行删除。

命令生效顺序(比如拥有’rm -i’这一别名的rm命令,系统如何判断是单纯执行rm,还是要执行rm -i):

  1. 用绝对路径或相对路径执行的命令(即直接定位到命令对应的可执行文件的位置);
  2. 执行别名;
  3. 执行Bash的内部命令(比如:cd);
  4. 执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
    所以从上面的四个优先级可以看出,别名的优先级高于按照$PATH环境变量来查找命令。

下面是一些常用的快捷键(ctrl+下面的按键):

  • c:强制终止当前命令;
  • l:清屏;
  • a:光标移动到命令行首;
  • e:光标移动到命令行尾;
  • u:从光标所在位置删除到行首;
  • z:把命令放入后台;
  • r:在历史命令中搜索(输入相应的关键字之后,会自动搜索出含有该关键字的命令)。
9-4 历史命令

查看历史命令:history
选项:

  1. -c:清空历史命令;
  2. -w:把缓存中历史命令写入到历史命令保存文件~/.bash_history。
    此处要注意的是,历史命令存在与缓存以及历史命令保存文件两个地方,一般只有在成功注销或者执行history -w命令之后,缓存中的历史命令才能正确写入~/.bash_history中。

系统默认保存1000条历史命令,如果要增加历史命令的保存数目,可以对/etx/profile文件中的HISTORY变量进行修改。

历史命令的调用:

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

用Tab键进行命令补全(目录补全是在$PATH环境变量下进行所搜的),文件补全和目录补全。

9-5 输出重定向

标准输入输出:

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

注意:计算机的标准输入是键盘,不包括鼠标等等其它的输入设备,而标准输出是显示器,不包括投影仪等。

输出重定向:改变标准输出的方向,也就是说,让输出不显示在屏幕上,而是记录在其它的地方,比如:文件中。

标准输出重定向:

  1. 命令 > 文件:以覆盖的方式,把命令的正确输出输出到指定的文件或者设备当中;
  2. 命令 >> 文件:以追加的方式,把命令的正确输出输出到指定的文件或者设备当中。

标准错误输出重定向:

  1. 错误命令 2>文件:以覆盖的方式,把命令的错误输出输出到指定的文件或者设备当中;
  2. 错误命令 2>>文件:以追加的方式,把命令的错误输出输出到指定的文件或者设备当中;
    注意:这里的"2"代表的就是上面表格中的文件描述符。但是,上面提到的输出重定向的缺点是:用户必须在输入命令的时候明确知道命令是否会得到错误的输出,但是这在一开始运行命令的时候往往是不知道的。

所以有下面的解决办法:

  1. 命令 > 文件 2>&1:以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件当中(这里"命令 > 文件 2>&1"的意思是:把正确的输出写入到文件,如果是错误的输出,则合并到正确的输出中一起写入文件);
  2. 命令 >> 文件 2>&1:以追加的方式,把正确的输出和错误的输出都保存到同一个文件当中;
  3. 命令 &> 文件:以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件当中(功能同1);
  4. 命令 &> 文件:以追加的方式,把正确的输出和错误的输出都保存到同一个文件当中(功能同2);
  5. 命令>>文件1 2>>文件2:把正确的输出追加到文件1,把错误的输出追加到文件2。
    BTW:/dev/null文件是Linux中的"无底洞",是系统帮用户准备的,用户可以将一些没有用的输出写入到这个文件中。就相当于输出信息的回收站。

输入重定向:改变终端输入的方式。也就是说,终端的输入不再是键盘,而可以是文件的内容等等。注意,输入重定向用的相对比较少,只作了解就足够了
用于统计文件行数,单词数以及字节数的命令:wc [选项][文件名]。
选项:

  1. -c:统计字节数;
  2. -w:统计单词书;
  3. -l:统计行数。
    注意:如果直接在终端输wc,则统计的是在按ctrl+D之前的文本内容的信息。

输入重定向举例:

  1. <:wc < test.log,表示对test.log文件的内容进行统计(其实,直接wc test.log也是可以的);
  2. <<:wc << 字符串,表示统计终端输入指定字符串之前的文本的信息。
9-6 管道符

多命令顺序执行的符号:

多命令执行符格式作用
;命令1;命令2多个命令之间顺序执行,命令之间没有任何逻辑关系(即无论前面的命令是否能够正确运行,后面的命令都会执行)
&&命令1&&命令2逻辑与,命令1正确执行的时候命令2才会执行
||命令1||命令2逻辑或,当命令1不正确执行的时候,命令2才会执行

BTW:关于多命令执行符,有下面的一些应用:

  1. 计算一条命令执行所占用的时间:“date;命令;date”,前后两次date的输出只差就是zhix中间的命令所占用的时间(当然,查看命令执行时间的方法还有很多);
  2. 查看一条命令是否正确执行:“命令 && echo yes || echo no”,如果该命令正确执行,则执行echo yes而不会执行echo no,否则,不执行echo yes而执行echo no。

管道符:“命令1|命令2,命令1的正确输出作为命令2的操作对象(也就是说,这个和”&&"类似,只是命令1的输出作为命令2的操作对象)。
EX:ls -l | more 。即分页查看(more的功能)ls -l的输出。又比如上面4-4节举的搜索字符串命令grep的例子:locate opencv | grep “2.4” 。又或者:ls -l | grep "caffe"等等。管道符有着很广泛的应用。

9-7 通配符

首先,有一点需要注意:通配符主要是用来匹配目录名或者文件名称的,如果要匹配文件内容,则需要用到正则表达式。

Linux中的通配符:

  1. *:匹配任意内容;
  2. ?:匹配任意一个字符;
  3. []:匹配任意一个括号中的字符。
    EX:find /root -name “ab?” 以及 find /root -name “ab[cd]” (后面的一句命令匹配的是名为abc或者abd的文件)
    • [-]:find /root -name "ab[a-d]"表示文件名的第三个字母是a-d中的任意一个;
    • [^]:find /root -name "ab[^a-d]"表示文件名的第三个字母不是a-d中的任意一个。

Linux中的其它特殊符号:

符号作用
‘’单引号。在单引号中的所有特殊符号,如“$”和“`”(反引号)都没有特殊的含义
“”双引号。在双引号中,特殊符号都没有特殊含义,但是“$”,“`”(反引号)和“\”是例外,拥有“调用变量的值”,“引用命令”和“转义符”的特殊含义
``反引号。反引号括起来的内容是系统命令,在Bash中先执行它。和 ( ) 的 作 用 是 一 样 的 , ∗ ∗ 不 过 推 荐 使 用 ()的作用是一样的,**不过推荐使用 ()使(),因为反引号非常容易看错**。EX:aa=`ls`的结果是将ls命令执行的结果赋值给变量
$()作用和反引号一样,用于引用系统命令
#代表行注释
$用于调用变量的值。
\转义符。跟在它后面的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用

注意:

  1. 第一行的是单引号,第三行的是反引号(反引号在键盘的左上角)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值