在Linux环境下,如果不懂bash是什么,那么其他的东西就不用学了
- 认识BASH这个SHELL
- Shell的变量功能
- Bash shell 的操作环境
- 数据流重定向
- 管道命令(pipe)
认识BASH这个SHELL
管理整个计算机硬件的是操作系统的内核(kernel),这个内核是需要被保护的。所以一般用户只能通过Shell来和内核进行沟通,以让内核完成我们所想要实现的任务
硬件、内核与Shell
必须输入一个命令之后,硬件才会通过执行的命令来工作。硬件如何知道执行的命令?那就是内核的管理工作,也就是说我们必须要通过Shell将我们输入的命令与内核沟通,好让内核可以控制硬件来正确无误地工作
操作系统其实是一组软件,由于这组软件在控制整个硬件与管理系统的活动检测,如果这组软件能被用户随意操作,若用户应用不当,会使得整个系统崩溃。当然不能够被一些没有管理能力的终端用户随意使用。
壳(shell)程序的功能只是提供用户操作系统的一个界面,因此这个壳程序需要可以调用其他软件才好,包括man、chmod、chown、vi、fdisk、mkfs等命令,这些命令都是独立的应用程序,但是我们可以通过壳程序(就是命令行模式)来操作这些应用程序,让这些应用程序调用内核来执行所需的任务
总结:只要能够操作应用程序的软件都能够称为壳程序(shell)。
狭义shell:命令行方面的软件,包括bash等
广义shell:包括图形用户界面模式的软件,因为图形用户界面模式其实也能够操作各种应用程序来调用内核工作
为何要学命令行模式的Shell
命令行模式的shell是很不好学的,但是学了之后好处多多
命令行模式的shell:大家都一样
界面shell软件虽然好用,但是当升级或使用其他程序管理模块时就会有所不同,且不能深入内核
命令行shell,几乎各个Linux发行版使用的bash都是一样的。可以轻松转换不同的Linux发行版
远程管理:命令行模式就是块
Linux的管理常常需要通过远程联机,联机时命令行模式的传输速度一定比较块,而且,比较不容易出现掉线或是信息外流的问题
Linux的“任督二脉”:shell
多学,甚至不学的精也没有关系,了解概念也就OK
此外,如果要将主机管理得好,那么良好的shell程序编写是一定需要的
系统的shell与/etc/shells 功能
早年的NUIX的shell有很多版本,例如Bourne shell(sh),C shell,K shell,TCSH等,每一种Shell都各有特点。
Linux使用的版本为Bourne Again SHell(简称bash),这个shell是Bourne shell 的增强版本,也是基准于GUN的架构下发展出来的
Linux的shell有如下:
- /bin/sh (被/bin/bash 替换)
- /bin/bash (Linux默认的shell)
- /bin/tcsh (整合C Shell,提供更多的功能)
- /bin/csh (被 /bin/tcsh 替换)
/etc/shells
Linux的某些服务在运行过程中,会去检查用户能够使用的shells,这些shell的查询就是借由/etc/shells这个文件
用户默认会取得哪一个shell在/etc/passwd 这个文件内
Bash shell的功能
bash主要兼容于sh,并且依据一些用户需求而加强的shell版本。
优点:
历史命令(history)
按上下键可以找到前后一个输入的命令,默认的记录命令达1000条。
记录文件为~/.bash_history,但只是记录上次即以前登录的shell,不会记录本次,本次保存在内存中,当注销系统后才会记录
可以方便地查询曾经做过地操作,但如果系统被入侵,则shell命令如果留有系统权限相关的账号密码则很危险,记录命令的条数多少还是取决于个人需求爱好
命令与文件补全功能([Tab]按键的好处)
- [Tab]接在遗传命令的第一个字的后面,则为命令补全
- [Tab]接在遗传命令的第二个字的后面,则为文件补齐
- 若安装了 bash-completion 软件,则在某些命令后面使用[Tab]按键时,可以进行【选项/参数的补齐】功能
命令别名设置功能 (alias)
命令别名,在命令行输入alias可以知道目前的命令别名有哪些,也可以直接执行名来来设置别名例如
任务管理、前台、后台控制 (job control、foreground、background)
多任务
程序化脚本 (shell scripts)
可以将平时管理系统常需要执行的连续命令写成一个文件,该文件并且可以通过交互式的方式来进行主机的检测工作,也可以借由shell提供的环境变量及相关命令来进行设计
通配符 (Wildcard)
bash支持许多通配符来帮助用户查询与命令执行,例如*
查询命令是否为Bash shell 的内置命令:type
man bash
利用type 来判断所执行的命令是bash源生还是外部
type [-tpa] name
选项与参数:
- :不加任何选项与参数时,tpye会显示出name时外部命令还是bash内置命令
- -t:type将name以下面这些字段显示含义:
file:外部命令
alias:命令别名名称
builtin:bash内置命令 - -p:当name为外部命令时,会显示完整文件名
- -a:会由PATH定义的路径中,将所有含name的命令都列出来,包含alias
如上图的shell中只有cd 命令为bash源生shell
type在查找时为查找执行文件,而不是一般文件,所以也可以用来作为类似which命令,只不过是专门查找shell
命令的执行与快速编辑按钮
利用反斜杠(\)转义字符转义回车键,让回车键不再具有开始执行的功能,让命令可以继续在下一行输入。[Enter]键是紧接着反斜杠(\)的,两者中间没有其他字符,因为\仅转义紧接着的下一个字符。如果转义回车键成功后,下一行最前面就会自动生成(>)的符号,可以继续输入命令
shell移动、删除快捷键:
- [Ctrl+u]、[Ctrl+k]:从光标处向前、向后删除命令
- [Ctrl+a]、[Ctrl+e]:光标移到命令行最前、后面
Shell的变量功能
Linux是多人多任务的环境,每个人登录系统都能取得一个bash shell,由于变量的不同,执行的结果也往往不同
什么是变量
变量就是以一组文字或符号等,来替换一些设置或一串保留的数据
用一个简单的“字眼”来替换另一个比较复杂或是容易变动的数据,方便!
变量的可变性与方便性
不需要修改程序代码,只需要将变量带入不同的内容即可
影响bash环境操作的变量
在Linux下,所有线程都需要一个执行码,只有在正确的登录Linux之后,才能以shell和Linux沟通。而在进入shell之前,由于系统需要一些变量来提供它数据的读写(或是一些环境的设置参数值,例如是否要显示色彩等),所以就有一些所谓的环境变量需要来读入系统中了。这些环境变量例如PATH、HOME、MAIL、SHELL等,都是很重要的,为了区别与自定义变量的不同,环境变量通常以大写字符来表示
脚本程序设计(shell script)的好帮手
写一个大型的脚本时,将该变量的定义写在最前面,后面相关的路径名称都以变量来替换,只要修改一行就等于修改了整篇脚本,很方便
变量的使用与设置:echo、变量设置规则、unset
可以使用echo 命令来使用变量,但是变量被使用时必须加上[$]才可以
查看变量如下:
修改变量时用(=)连接变量与值
修改变量如下:
在bash shell中:当一个变量名称尚未被设置时,echo 该变量默认内容为空
其他shell 中:当一个变量名称尚未被设置时,echo 该变量 可能会出现错误信息
变量的设置规则
- 变量与变量内容以一个等号[=]来连接
- 等号两边不能直接接空格
- 变量名称只能是英文字母与数字,但不能以数字开头
- 变量内容若有空格可使用双引号或单引号将变量内容结合起来。
但双引号内的特殊字符如$PATH可以保有原本的特性,$PATH表示环境变量
单引号内的特殊字符仅为一般文本$PATH不能表示环境变量 - 可使用转义字符[]将特殊符号变成一般字符
- 在一串命令的执行中,还需要借由其他额外的命令所提供的信息时,可以使用反单引号[
命令
](键盘上方数字1左边的按键)或[$(命令)]
- 若该变量为扩增变量内容时,则可以用"$变量名称"或${变量}累加内容
- 若该变量需要在其他子程序执行,则需要以export来使变量变成环境变量
- 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断
- 取消变量的方法为[unset 变量名称]
子进程:在当前shell下区启用另一个新的shell,新的shell为子进程
进入内核目录如上图
各个不同账户下的~家目录的环境变量
环境变量的功能
环境变量功能:根目录(主文件夹)的变换、提示字符的显示、执行文件查找的路径等
利用enc与export查看shell环境变量
用env 观察环境变量与常见环境变量说明
env(environment)列出所有的环境变量,各个参数如下:
- HOME:用户的根目录~
- SHELL:环境使用的SHELL是哪个程序,默认是/bin/bash
- HISTSIZE:历史命令记录的条数 ~/.bash_history
- MAIL:系统读取的邮箱文件(mailbox)
- PATH:执行文件查找的路径,目录与目录中间以[:]分割,顺序是由PATH的变量内的目录来查询
- LANG:语系数据,很多信息都会用到它,有的时候可能需要自定义一下语系数据
- RANDOM:随机数变量,随机数生成器,一般为/dev/random 文件,变量内容介于0~32767
set 观察所有变量(环境变量与自定义变量)
bash除环境变量外还有与bash操作界面有关的变量以及用户自己定义的变量存在。
使用set显示除了环境变量之外,还会将其他bash内的变量通通显示出来
man set
影响显示结果的于系变量 (locale)
目前Linux发行版已经支持日渐流行的Unicode,可使用locale命令来查询所有支持语系
man locale
所有支持的语系 locale -a
自定义编码变量 locale
系统默认语系问文件在/etc/locale.conf
**如果其他语系变量都未设置,且有设置LANG或是LC_ALL时,则其他的语系变量就会被这两个变量所替换。**所以Linux当中,通常仅设置LANG或LC_ALL这两个变量而已
变量的有效范围
如果在程序运行的时候,有父进程和子进程的不同进程的关系时,则变量可否被引用与export有关,被export后的变量,我们可以称为环境变量,环境变量可以被子进程所引用,但其他的自定义变量就不会存在于子进程中。
变量键盘读取、数组与申明:read、array、declare
read
要读取来自键盘输入的变量,就是read这个命令,经常被用在shell脚本的编写当中,用户和用户交互
read [-pt] variable
选项与参数
- -p:后面可以接提示字符
- =t:后面可以接等待的(秒数),不会一直等待使用者
declare,typeset
declare或typeset是一样的功能,就是声明变量的类型
decalre [-aixr] variable
选项与参数:
- -a:将后面名为variable的变量定义成为数组(array)类型
- -i:将后面名为variable的变量定义成为整数(integer)类型
- -x:与export用法一样,将后面的variable变成环境变量
- -r:将变量设置称为readonly类型,改变累不可被更改内容,也不能unset
bash变量的几个基本定义
- 变量类型默认为字符串,所以不指定变量类型1+2默认为一个字符串而不是计算式
- bash环境中的数值运算,默认最多仅能到达整数形态,所以1/3结果为0
数组(array)变量类型
与文件系统及程序的限制关系:ulimit
为防止系统资源爆掉(例如CPU、内存等)我们的bash是可以限制用户的某些系统资源,包括可以开启的文件数量,可以使用的CPU时间,可以使用的内存总量等
ulimit [-SHacdfltu] [配额]
选项与参数:
- -H:
- -S:
- -a:
- -c:
- -f:
- -d:
- -l:
- -t:
- -u:
变量内容的删除、取代与替换(可选)
命令别名与历史命令
Bash shell 的操作环境
登录的时候我们还可以给予用户一些信息或欢迎文字,这些设置又可以分为系统全局设置与个人喜好设置值,仅是一些文件放置的地点不同
路径与命令查找顺序
基本上,命令的运行顺序如下:
1.以相对/绝对路径执行命令
2.由alias找到该命令来执行
3.由bash内置的(builtin)命令来执行
4.通过$PATH 这个变量的顺序查找到的第一个命令来执行
查看执行顺序可以直接使用 type -a 命令
bash的登录与欢迎信息:/etc/issue、/etc/motd
阿里云的服务器/etc/issue、/etc/motd内容如下:
这就是连接登录的欢迎标语Welcome to Alibaba Cloud Elastic Compute Service !来源
当我们使用talent连接到主机时,主机的登录画面就会显示/etc/issue.net 而不是/etc/issue
**如果想要让用户登录后取得一些信息,例如您想要让大家都知道的信息,那么可以将信息加入/etc/motd里面。**例如当登录后,告诉登录者系统将会在某个时间进行维护工作,可以加入提示信息,但一定要用root的身份才能修改
bash 的环境配置修改
系统有一些环境配置文件,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境
- login shell:取得bash时需要完整的登录流程,称为login shell
例如:由tty1~tty6登录,需要输入用户的正好密码,此时的bash为login shell - non-login shell:取得bash的方法不需要重复登录的操作。
例如:X Window登录Linux后,再以X图形化接口启动终端,不需要输入账号密码,该bash为non-login shell;在原本的bash环境下再次执行bash子进程,也不需要输入账号密码,第二个bash也为non-login shell
终端的环境设置:stty、set
bash的默认组合键:
- [Ctrl+C]:终止目前的命令
- [Ctrl+D]:输入结束(EOF),例如邮件结束的时候
- [Ctrl+M]:回车
- [Ctrl+S]:暂停屏幕的输出
- [Ctrl+Q]:恢复屏幕的输出
- [Ctrl+U]:在提示字符下,将整列命令删除
- [Ctrl+Z]:暂停目前的命令
通配符与特殊符号
###bash的通配符:
- *:0~∞个任意字符
- ?:一定由一个任意字符
- []:一定有一个在括号内的字符(非任意字符)。[abc]即一定有abc中的某一个字符
- [ - ]:代表在顺序内的所有字符,[1-10]代表1-10之间的所有数据
- [^ ]:反向选择,[^abc]代表一定有一个非abc字符
bash的特殊符号:
- #:注释符号
- \:转义字符
- |:管道(pipe),分隔两个管道命令的符号
- ;:连续命令执行分隔符;连续性命令的界定
- ~:当前用户家目录
- $:使用白努力前导符(变量之前需要加的变量替换值)
- &:任务管理(job control),将命令变成后台任务
- !:逻辑意义非(not)的意思
- /:目录符号,路劲分隔的符号
-
、>>:数据流重定向:输出定向,替换[>]、累加[>>]
- <、<<:数据流重定向:输入定向
- '':单引号,不具有变量转换的功能($ 变为纯文本)
- "":双引号,具有变量转换的功能($ 保留相关功能)
:
中间为可以先执行的命令,亦可使用$()- ():中间为子shell的起始与结束
- {}:中间为命令区块的组合
数据流重定向
数据流重定向:将某个命令执行后应该要出现在屏幕上的数据,给他传输到其他的地方,例如文件或是设备打印机等。
什么是数据流重定向
standard output与standard error output
标准输出指的是命令执行所返回的正确信息,
标准错误输出为命令执行失败后所返回的错误信息
可以通过数据流重定向的功能,将standard output与standard error output分别传送到其他文件或设备,而不是统一为显示屏控制台,特殊字符如下:
- 标准输入(stdin):代码为0,使用<或<<
- 标准输出(stdout):代码为1,使用>或>>
- 标准错误输出(stderr):代码为2,使用2>或2>>
vim该文件,得到的是ls -a ~输出的内容如下
管道命令(pipe)
管道命令使用[|]界定符号,且其与连续执行命令[;]不同。
ls -al /etc |less
上述shell表示ls执行后的信息由less读取,可利用less上下翻页功能。
管道命令[|]仅能处理经由前面一个命令传来的正确信息,就是标准输出的信息,对于标准错误并没有直接处理的能力(可以使用2>&1重定向,让标准错误也可被处理)
- 管道命令金辉处理标准输出,对于标准错误会予以忽略
- 管道命令必须要能够接收来自前一个命令的数据称为标准输入继续处理才行
选取命令:cut、grep
选区信息通常是针对u一行一行来分析,并不是整篇信息分析
cut
man cut
cut选项与参数:
- -d:后面接分隔字符,与-f一起使用
- -f:根据-d的分割字符将以短信息划分成为数段,用-f去除第几段的意思
- -c:以字符(characters)的单位去除固定字符区间
取出环境变量PATH以:分割的第五段和第三段如上
总结:cut的主要用途在于将同意后里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。在处理多空格相连的数据可以使用awk来替换cut
grep
grep是分析一行信息,若当中由我们所需要的信息,就将该行拿出来
man grep
grep [-acinv] [--color=auto] '查找字符' filename
grep选项与参数:
- -a:将二进制文件以文本文件的方式查找数据
- -c:计算找到‘查找字符’的次数
- -i:忽略大小写
- -n:顺便输出行号
- -v;反向选择,显示出没有‘查找字符’内容的那一行
- --color=auto:将找到的关键字部分加上颜色的显示
如上利用ps -ef 查找到所有进程,使用管道命令|将数据传入grep,查找到所查找的进程,得到pid后,可使用kill命令杀死进程,且由上图可得到默认的grep即为grep --color=auto
man ps:
排序命令:sort、wc、uniq
sort
sort可以进行排序,而且可以根据不同的数据形式来排序,列入数字和文字的排序不同
sort [-fbMnrtuk] [files or stdin]
选项与参数:
- -f:忽略大小写的差异
- -b:忽略最前面的空格字符部分
- -M:以月份的名字来排序
- -n:使用纯数字进行排序(默认为文字形式)
- -r:反向排序
- -u:uniq,唯一,仅出现一行代表
- -t:分隔符好,默认用[Tab]来分隔
- -k:以哪个区间(field)来进行排序的意思
uniq
wc
双重定向:tee
字符转换命令:tr、col、join、paste、expand
划分命令:split
参数代换:xargs
很多命令不支持管道命令,我们可以通过xargs 来提供该命令使用标准输入
关于减号[-]的用途
某些命令需要用到文件名(例如tar)来进行处理时,该stdin与stdout可以利用减号[-]来替代
Comments | 0 条评论