认识shell
一、shell的初步认识
只要能够操作应用程序的接口都称为shell,狭义的shell是指命令行方面的软件,包括bash等。广义的shell则包括图形界面的软件,图形界面也可以操作各种应用程序来调用内核工作。
二、bash shell的功能
1.命令记忆功能
只要在命令行中按上下键就可以找到前/后执行过的命令
2.命令与文件补全功能
[Tab]键接在一串命令的第一个字的后面,为命令补全
[Tab]键接在一串命令的第二个字的后面,为文件补齐
3.命令别名设置功能
设置别名: alias 新名字=原名
例如:查看这个目录下的所有文件(包含隐藏文件)及所有文件的属性,直接以lm这个自定义的命令来替换上面的命令 alias lm=’ls -al’
4.作业控制、前台、后台控制
5.程序脚本
将平时管理系统需要执行的连续命令写成一个文件,该文件并且可以通过交互的方式来进行主机的检测工作。也可以通过shell提供的环境变量及相关命令来进行设计。整个设计下来就是一个小型的程序语言了。
6.通配符
除了完整的字符串之外,bash还支持许多的通配符来帮助用户查询与命令执行。举个例子,想要知道/usr/bin下面有多少以X开头的文件,使用“ls-l /usr/bin/X*”就可以知道。
三、bash shell的内置命令:type
通过type这个命令可以知道每个命令是否为bash的内置命令。
参数:
type :不加任何参数,type会显示出name是外部命令还是bash内置命令
-t:type会将name以下面的字眼显示出它的意义:
file: 外部命令
alias: 该命令为命令别名所设置的名称
builtin: 该命令为bash内置的命令功能
-p:若后边接的name为外部命令时,才能显示完整文件名
-a:会有PATH变量定义的路径中,将所有含name的命令都列出来,包含alias
四、shell的变量功能
1.变量的显示:echo
其中,variable没有任何数据,echo可以用来读出变量的内容。
2.设置/修改变量的内容
在bash中,当一个变量名称尚未设置时,默认的内容是空,在设置变量的时候也要注意一些规则。
变量设置规则:
* 变量与变量内容以“=”来连接,等号两边不能有空格字符
* 变量名称只能是英文字母与数字,数字不能是开头
* 变量内容有空格字符可使用双引号或单引号括起来
* 可用转义字符“\”将特殊符号(如[Enter]、$、\、空格、!等)变为一般字符
* 在一串命令中,还需要通过其他命令提供的信息,可以用反单引号"`命令`"或“$命令”
* 给该变量增加内容时,可用“$变量名称”增加内容
* 若该变量需要在其他子程序执行,需要以export来使变量变为环境变量
* 通常大写字符为系统默认变量,自行设置的可以使用小写字符
* 取消变量的方法为使用“unset变量名称”
五、环境变量
用env就可以查看环境变量了
* HOME:用户的主文件夹
* SHELL:目前环境使用的shell是哪个程序,Linux下默认的是/bin/bash的
* HISTSIZE:与历史命令有关,曾经执行过的命令可以被系统记录下来,记录的条数由这个值来设置
* MALL:在收信时系统会去读取的邮件信箱文件
* PATH:执行文件查找路径
* LANG:语系数据
* RANDOM:随机数的变量,随机数生成器在/dev/random中,可通过这个随机数文件的相关变量来随机取得随机数值。在BASH环境中,变量内容介于0~32767。
第二个是产生0~9的随机值。
* 用set查看所有变量
* 查看本shell的PID
* export:自定义变量转化为环境变量
环境变量与自定义变量的区别在于是否会被子进程所继续引用
子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量,因此,原本bash中的自定义变量在进入子进程会消失不见,一直到离开子进程并返回到原本的父进程后,这个变量才会出现
环境变量为什么会被子进程所引用?
* 当启动一个shell,操作系统会分配一记忆块给shell用,此内存内的变量可以让子进程取用
* 若在父进程利用export功能,可以让自定义变量的内容写在上述的记忆块当中
* 当加载另一个shell时,(即启动子进程,离开原本的父进程),子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量块中
六、变量键盘读取、数组与声明:read,array,declare
1.read
读取来自键盘输入的变量
基本语法:
read [-p/t] variable
-p:后边可以接提示符
-t:后边可以接等待的秒数
read之后不加任何参数,直接加上变量名称,就会出现一个空白行等待输入。
2.declare/typeset
声明变量的类型
基本语法:
declare [-a/i/x/r] variable
-a:将变量定义为数组类型
-i:将变量定义为整数数字类型
-x:将变量定义为环境变量类型
-r:将变量设置为readonly类型,不可更改,不可重设
3.数组(array)变量类型
基本语法:
var[index]=值
读取时用$读取
七、变量内容的删除、替代、替换
变量内容删除与替换
八、命令别名与历史
1.命令别名设置:alias,unalias
alias 新名字=旧名字
unalias 新名字
例题:DOS年代,列出目录与文件就是dir,而清除屏幕就是cls,那么我们想在linux里面也使用相同的命令呢?
alias cls=’clear’
alias dir=’ls -l’
2.历史命令:history
history [n]
history [-c]
history [-r/a/w] histfiles
参数:
n:数字,列出最近的n条命令行
-c:将目前shell中的所有history内容全部清除
-a:将目前新增的history命令新增入histfiles中,若没有加histfiles,则写入默认的~/.bash_history
-r:将histfiles的内容读到目前这个shell的history中
-w:将目前的history记忆内容写入histfiles中
九、管道命令
假设我们需要知道/etc/下面有多少文件,可以利用ls/etc来查阅,但是,由于该文件目录下的文件太多,屏幕会占满,不知道前面输出的内容是什么,此时我们可以通过less命令协助,利用:ls -al /etc | less
这样,ls命令输出后的内容就能够被less读取,并且利用less的功能,就可以前后翻动相关的信息了。
其实,管道命令仅能处理前面一个命令传来的正确信息,对错误信息没有接受能力。
十、选取命令:cut,grep
1.cut
基本语法:
cut -d’分隔字符’ -f fields 用于分隔字符
cut -c 字符范围 用于排列整齐的信息
参数:
-d:后边接分隔字符,与-f一起使用
-f:依据-d的分隔字符将一段信息切割成数段,用-f取出第几段
-c:以字符的单位取出固定字符区间
cut主要的用途在于将同一行里面的数据进行分解,最长使用分析一些数据或文字数据的时候。
2.grep
基本语法:
grep [-a/c/i/n/v] [–color=auto] ‘查找字符串’ filename
参数:
-a:将binary文件以text文件的方式查找数据
-c:计算找到‘查找字符串’的次数
-i:忽略大小写的不同
-v:反向选择,显示没有‘查找字符串’内容的那一行
–color=auto:将找到的关键字部分加上颜色显示
十一、排序命令:sort,wc,uniq
1.sort
基本语法:
sort [-f/b/M/n/r/t/u/k] [file or stdin]
参数:
-f:忽略大小写
-b:忽略前面空格符
-M:以月份的名字来排序
-n:使用纯数字来排序
-r:反向排序
-t:分隔符,默认使用[Tab]来分隔
-u:相同的数据只出现一行
-k:以field来进行排序
2.uniq
排序完成后,将重复的数据仅列出一个显示
基本语法:
uniq [-i/c]
-i:忽略大小写的不同
-c:进行计数
3.wc
计算输出信息的整体数据
基本语法:
wc [-l/w/m]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
十二、双向重定向:tee
我们知道>会将数据流整个传送给文件或设备,因此我们除非去读取该文件或设备,否则无法继续利用这个数据流,而tee就可以将这个数据流的处理过程中将某段信息存下来。
基本语法:
tee [-a] file
-a:以累加的方式,将数据加入file中
tee可以将输出转存一份到文件内并以同样的数据继续送到屏幕去处理。除了可以让我们同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间暂存盘记录之用