小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Computer & DL
  4. Linux
  5. 正文

《鸟哥的Linux私房菜》(基础篇)笔记整理(第10章)Part.1

2019年1月7日 1146点热度 0人点赞 0条评论

一、认识bash这个shell

操作系统就是一组软件,由这组软件在控制整个硬件爱你与管理系统的活动检测,如果这组软件能被用户随意的操作,那么当使用者使用不当的时候,就会使整个系统崩溃。所以用户可以透过应用程序来指挥kernel,让kernel完成我们需要的硬件任务。

也就是说,只有能够操作应用程序的借口都能被称为壳(shell)程序。狭义的壳程序指的是指令行方面的软件,包括bash。广义的shell泽包括了图形接口的软件,因为图形接口其实也能够操作各种应用程序来调用内核工作。

通过在/etc/shells文件,我们就可以看到自己的linux下面有几个可用的shells。例如我的是:

/bin/sh

/bin/bash(Linux默认的shell)

/bin/rbash

/bin/dash

bash有以下几I个有点

(1)命令记忆能力。

(2)命令与文件补全功能(Tab案件)。使用Tab的作用:

①Tab接着一串命令的第一个字后面,则为命令补全;

②Tab接着一串命令的第二个字后面,则为文件补全;

③若安装了bash-completion软件,则在某些命令后面使用Tab的时候,可以执行“选项/参数补全”功能。

(3)命令别名设置功能(alias)。比如我们可以使用“lm”来代替“ls -al”,那么我们可以使用下面的命令:

alias lm =’ls -al’

(4)作业控制、前台、后台控制。使用前台、后台的控制可以让作业进行得更为顺利。至于作业控制,可以让我们随时将工作丢到后台去执行,而不怕使用Ctrl+C来中断该程序,也可以在单一登录的环境中达到多任务的目的。

(5)程序脚本。

(6)通配符:使用通配符来匹配想要的文件。

另外,我们还可以使用type命令来查询命令是否为Bash shell的内置命令。使用格式如下:

[dmtsai@study ~]$ type [-tpa] name

选项与参数:

:不加任何选项与参数时,type会显示出name是外部指令还是bash内建指令

-t:当加入-t参数时,type会将name以底下这些字眼显示出他的意义:

file:表示为外部指令;

alias:表示该指令为命令别名所设定的名称;

builtin:表示该指令为bash内建的指令功能;

-p:如果后面接的name为外部指令时,才会显示完整文件名;

-a:会由PATH变量定义的路径中,将所有含name的指令都列出来,包含alias

如果命令太长,我们可以使用两行输出,只需要在线要切换到第二行的地方输入一个“\”然后敲回车即可。

另外,如果命令特别长,或者输入了一串错误的命令时,你想要快速将这个命令删除掉,可以用一下组合键:

组合键 功能与示例
[ctrl]+u/[ctrl]+k 分别是从光标处向前删除指令串([ctrl]+u)及向后删除指令串([ctrl]+k)。
[ctrl]+a/[ctrl]+e 分别是让光标移到指令串的最前面([ctrl]+a)或最后面([ctrl]+e)。

 

二、shell的变量功能

变量是以一组文字或符号等,来取代一些设置或者一串保留的数组。

1.变量的取用与设定:echo,变量设定规则,unset

使用echo进行变量取用的格式如下所示:

[dmtsai@study ~]$ echo ${PATH}

使用echo进行变量的设定:

[dmtsai@study ~]$ echo ${myname}

[dmtsai@study ~]$ myname=xiaoao

变量的设置规则:

(1)变量与变量内容以“=”相连接。

(2)等号两边不能直接接空格。例如myname = xiaoao是错误的。

(3)变量名称只能是英文与数字,但是开头字符不能是数字。

(4)变量内容若有空格,可使用双引号或单引号将内容结合起来,他们有以下不同:

①双引号内的特殊字符如$等,可以保有原来的特性。例如

『var="lang is $LANG"』,则『echo $var』可得『lang is zh_TW.UTF-8』。

②单引号内的特殊字符仅为一般字符,例如

『var='lang is $LANG'』,则『echo $var』可得『lang is $LANG』。

(5)可用转义字符“\”将特殊符号(例如Enter、$、\、空格符、‘等)变成一般字符。

(6)在一串命令的执行中,还需要通过其它的命令提供的信息,可以使用反单引号“`指令`”或“$(指令)”。特别注意,那个`是键盘上方的数字键1左边那个按键。

(7)若该变量为了增加变量内容时,可以使用“$变量名称”或“${变量}”来累加内容。

(8)若改变量需要在其它子程序运行,则需要以export来使变量变成环境变量。

(9)通常大写字母为系统默认变量,自行设置的变量可以使用小写字母,方便用户判断。

(10)取消变量的方法为使用unset。使用方式为“unset 变量名称”。

下面做一个小练习,如图2.1所示。

图2.1 练习图

2.环境变量的功能

(1)用env观察环境变量。在终端情况下,输入env,可以得到当前系统下所有的环境变量及其内容。

常用的几个环境变量说明如下:

环境变量名称 环境变量说明
HOME 顾名思义,HOME目录。
SHELL 默认使用的shell程序。
HISTSIZE 历史命令的记录个数
MAIL 使用mail命令收信时,系统回去读取邮箱。
PATH 执行文件查询的路经,目录与目录之间以:分割。
LANG 语言版本资料。
RANDOM 随机数变量。只需要echo ${RANDOM}就可以得到0~32767的数值。特别说明,如果想使用0~9之间的数,可以用declare来声明数值类型,然后执行“declare -i number=$RANDOM*10/32768 ; echo $number”

(2)用set观察所有变量(含环境变量和自定义变量)

在系统变量中,比较重要的有以下几个:

①PS1(提示字符的设置)。这个东西就是我们的“命令提示字符”。

②$(关于本shell的PID):目前这个Shell的线程带好,也就是所谓的PID(Process ID)。

③?(关于上个执行命令的回传码):上一个执行的指令回传的值。

④OSTYPE,HOSTTYPE,MACHTYPE(主机硬件与内核的等级)

(3)export:自动将变量转为环境变量。

3.影响显示结果的语系变量(locale)

我们可以通过使用“locale -a”命令获取我们的Linux支持多少种语系。

如果其他的语系变量都未设定,且你有设定LANG或者是LC_ALL时,则其他的语系变量就会被这两个变量所取代。

4.变量的有效范围

环境变量=全局变量;自定义变量=局部变量。

5.变量键盘读取、数组与声明:read、array、declare

(1)read

要读取来自键盘输入的变量,就是用read。read的语法如下:

[dmtsai@study ~]$ read [-pt] variable

选项与参数:

-p:后面可以接提示字符

-t:后面可以接等待的秒数。

read之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入。如果加上-t后面接秒数,那么指定秒数之内没有任何动作时,该指令就会自动略过。如果是加上-p,在输入的光标前就会有比较多可以用的提示字符给我们参考。

(2)declare/typeset

声明变量的类型。如果declare后面没有接任何参数,那么bash就会主动将所有变量名称与内容通通调出来。declare用法如下:

[dmtsai@study ~]$ declare [-aixr] variable

选项与参数:

-a:将后面名为variable的变量定义成为数组(array)类型;

-i:将后面名为variable的变量定义成为整数数字(integer)类型;

-x:用法与export一样,就是将后面的variable变成环境变量;

-r:将变量设定成为readonly类型,该变量不可被更改内容,也不能unset。

注意以下两个事项:

①变量类型预设为字符串,所以若不指定变量类型,那么就会直接现实出来。

②bash环境中的数值计算只能计算整形。

(3)数组变量类型

在bash里面,数组的设置方式为:var[index]=content

例如:

范例:设定上面提到的 var[1] ~ var[3] 的变量。

[dmtsai@study ~]$ var[1]="small min"

[dmtsai@study ~]$ var[2]="big min"

[dmtsai@study ~]$ var[3]="nice min"

[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"

small min, big min, nice min

6.与文件系统及程序的限制关系:ulimit

我们的bash可以“限制使用者的某些系统资源”,包括打开文件的数量、可以使用的CPU时间、可以使用的内存总量等。使用方式如下:

[dmtsai@study ~]$ ulimit [-SHacdfltu] [配额]

选项与参数:

-H:hardlimit,严格的设定,必定不能超过这个设定的数值;

-S:softlimit,警告的设定,可以超过这个设定值,但是若超过则有警告信息。在设定上,通常soft会比hard小,举例来说,soft可设定为80而hard设定为100,那么你可以使用到90,但介于80~100之间时,系统会有警告信息通知你。

-a:后面不接任何选项与参数,可列出所有的限制额度;

-c:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(corefile)。此为限制每个核心文件的最大容量。

-f:此shell可以建立的最大文件容量(一般可能设定为2GB)单位为Kbytes

-d:程序可使用的最大内存段落(segment)容量;

-l:可用于锁定(lock)的内存量

-t:可使用的最大CPU时间(单位为秒)

-u:单一用户可以使用的最大程序(process)数量。

注意:

想要复原ulimit的设定最简单的方法就是注销再登入,否则就是得要重新以ulimit设定才行!不过,要注意的是,一般身份使用者如果以ulimit设定了-f的文件大小,那么他『只能继续减小文件容量,不能增加文件容量喔!』另外,若想要管控使用者的ulimit限值,可以参考第十三章的pam的介绍

7.变量内容的删除、替代和替换

(1)变量内容的删除去替换

以下面来说明:

${variable#/*local/bin:}

上面的特殊字体部分是关键词!用在这种删除模式所必须存在的

${variable#/*local/bin:}

这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦!

${variable#/*local/bin:}

这是重点!代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个。当使用了两个#之后,就是删除最长的那一个。

${variable#/*local/bin:}

代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。

需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符

所以:

#是符合替换文字“最短”的那一个;##是符合替换文字的“最长”的那一个。

如果是从右往左看,就用%。例如

[dmtsai@study ~]$ echo ${path%:*bin}

总的来说,有以下几点:

变量设定方式 说明
${变量#关键词}
${变量##关键词}
若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}
${变量%%关键词}
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串}
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

(2)变量的测试与内容替换

在某些时候,我们需要判断某个变量是否存在,若存在则使用既有设置,否则就赋予一个固定设置。如下所示:

new_var=${old_var-content}

新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}

这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}

旧的变量,被测试的项目!

new_var=${old_var-content}

变量的『内容』,在本范例中,这个部分是在『给予未设定变量的内容』

具体设置如下:

变量设定方式 str 没有预设 str预设为空字符串 str预设非为空字符串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr
var=expr
str 不变
var=
str 不变
var=$str
var=${str:=expr} str=expr
var=expr
str=expr
var=expr
str 不变
var=$str
var=${str?expr} expr 输出至 stderr var= var=$str
var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux 鸟哥的linux私房菜
最后更新:2019年1月7日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
个人用VB制作了一个计算器,大家来捧场吧 计算机组成原理笔记第一章(1) 新建济南至莱芜高速铁路项目环境影响评价信息公示 变成阿凡达 2013年山东高考本科上线资料统计(个人制作) 努力
标签聚合
Java python学习 高中 生活 linux 算法 leetcode 学习 Python 鸟哥的linux私房菜
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号