1、认识BASH这个shell
1.1、硬件、核心与shell
- 通过shell将我们输入的指令与Kernel沟通,让Kernel可以控制硬件来正确无误的工作。
- 只要能够操作应用程序的接口都能够成为壳程序。
狭义的壳程序指的是指令列方面的软件,如bash,广义的壳程序则包括图形接口的软件,因为图形接口也能够操作各种应用程序来呼叫核心工作。
1.2、学习文字接口shell的必要性
- 几乎各家的distributions使用的bash都一样;
- 文字接口速度快;
- 想成为系统管理员,shell与shell scripts必须要学;
1.3、系统的合法shell与/etc/shells功能
- cat /etc/shells:可以查看系统有哪些可用的shells;
- cat /etc/passwd:登录时使用者获取的shell可以通过这个命令查看
- /bin/bash是Linux预设的shell,目前也是Linux distribution的标准shell,bash兼容sh;
1.4、Bash shell的功能
- 命令编修能力
在家目录里的.bash_history里面记录了你之前使用过的命令- 命令与档案的不全功能
Tab接在一窜指令的第一个字的后面,则为命令补全;
Tab接在一窜指令的第二个字以后,则为档案补全;- 命令别名设定功能:alias
例如:alias lm='ls -al'
直接输入alias可以查看目前的别名- 程序化脚本:shell scripts
- 通配符
shell支持许多的通配符来帮助用户查询与下达指令;
例如:ls -l /usr/bin/X*
1.5、Bash shell的内建命令:type
为了方便shell的操作,bash已经内建了很多指令,例如cd等
可以利用type来判断该指令是内建指令还是外部指令;
type 【-tpa】name
1.6、指令的下达
反斜杠“\”可用于跳脱 如果[Enter]
2、Shell的变量功能
2.1、什么是变量
变量就是某个一特定字符串代表不固定的内容。
- 数据的可变性和方便性;
- 影像bash环境操作的变量
- 脚本程序设计(shell script)的帮手
2.2、变量的取用与设定:echo,变量设定规则,unset
变量输出:echo 等,可以保留原本的特性;单引号内的特殊字符则仅为一般字符(纯文本);
5、可用跳脱字符\将特殊符号如回车键、(指令);
7、若该变量为扩增变量内容,则可用“{变量}累加内容,如PATH="$PATH":/home/bin
8、若该变量需要其他子程序执行,则需要使用export来使变量变为环境变量;
9、通常大写字符为系统默认变量,自行设定变量可以使用小写字符;
10、取消变量的使用方法使用unset:变量名称,如unset myname
2.3、环境变量的功能:env与常见环境变量说明,set,export
- 用env观察环境变量与常见环境变量说明
命令:evn
常见环境变量:
1、HOME:代表用户的家目录
2、SHELL:目前环境使用的SHELL,预设使用/bin/bash
3、HISTSIZE:记录我们曾经下达过的指令的数量
4、MAIL:邮件信箱档案
5、PATH:执行文件搜索路径
6、LANG:语系数据
7、RANDOM:随机数变零- 用set观察所有变量(含环境变量和自定义变量)
命令:set
比较重要的变量有:
1、PS1:就是我们得命令提示符
1)\d:可显示出【星期 月 日】的日期格式
2)\H:完整的主机名
3)\h:主机名第一个小数点之前的名字
4)\t:显示时间HH:MM:SS
5)\T:显示时间,为12小时格式的HH:MM:SS
6)\A:显示时间,为24小时格式的HH:MM
7)@:显示时间,为12小时的am/pm
8)\u:目前使用者的账号名称:如root
9)\v:BASH的版本信息
10)\w:完整的工作目录名称,由根目录写起的目录名称
11)\W:利用basename函数取得的工作目录名称
12)#:下达的第几个指令
13)$:提示字符,如果是root时,提示字符为#,否则就是:关于本shell的PID
代表的是目前这个shell的线程代号,亦即所谓的PID
echo $$
3、?:关于上个执行指令的回传值
上一个回传指令所传回的值。当我们执行某些指令时,这些指令都会回传一个执行后的代码,一般来说,如果成功的执行该指令,则会回传一个0值,如果执行过程发生错误,就会回传错误代码;
4、自定义变量转成环境变量
子程序会继承父程序的环境变量,但是不会继承父程序的自定义变量
如果想将父程序的自定义变量在子程序使用,使用export 变量名称
2.4、影响显示结果的语系变量(local)
查询Linux支持的语系:locale -a
l修订编码:locale
2.5、变量的有效范围
全局变量=环境变量
自定义变量=局部变量
内存配置关系:
1、当启动一个shell,操作系统会分配一记忆区块给shell使用,次内存的扁郎可以让子程序取用;
2、若在父程序利用export功能,可以让自定义便领的内容写到上述记忆区块中;
3、当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量区块当中;
2.6、变量键盘读取、数组与宣告:read,declare,array
- read 【-pt】variable
-p:后面接提示字符
-t:后面可接等待的秒数- declare/typeset
宣告变量的类型
declare 【-aixr】variable
-a:将后面名为variable的变量定义为数据类型
-i:将后面名为variable的变量定义为整数数字;
-x:用法和export一样
-r:将变量设定为readonly类型,该变量不可被更改内容,也不能unset
变量默认类型为字符串
declare -i sum=200+300
将环境变量变为自定义变量
declare +x sum
将自定义变量变为环境变量
declare -x sum- array:数组变量类型
数组定义方式 var[index]=content
var[0]=1
2.7、与文件系统及程序的限制关系
限制用户的某些系统资源,包括可以开启的档案数量,可以使用的cpu时间,可以使用的内容总量等等;
ulimit 【-SHacdfltu】 【配额】
2.8、变量内容的删除、取代与替换:删除与取代,测试与替换
- 变量内容的删除与取代
1、{variable#/:}
代表删除前面所有的内容,取最短的那个
3、{path%:bin}
echo ${path%%:*bin}- 变量内容的取代
echo ${path/sbin/SBIN}
两斜线中间的是旧字符串,后面的新字符串;- 变量的测试与内容个替换
1、判断某个变量是否存在,若变量存在则使用既有的设定,若变量不存在则给予一个常用的设定;
username={username:-root}
3、如果想将旧变量一起替换掉,则用=号;
var={str?无此变数}
3、命令别名与历史记录
3.1、命令别名设定:alias,unalias
alias:查看别名
别名还可以取代既有的指令
取消别名:unalias
3.2、历史命令:history,HISTSIZE
history [n]:列出最近的n笔命令行表;
history[c]:将目前的shell中的所有history内容全部消除;
history [-arw] histfiles
-a:将目前新增的histroy指令新增如histfiles中,若没有加histfiles,则预设写入~/.bash_history
-r:将histfiles的内容读到目前这个shell的history记忆中
-w:将目前的history记忆内容写入histfiles中;
history还可以帮助执行指令
1、!number
执行第几笔指令
2、!commond
由最近的指令向前搜寻指令窜开头位commond的那个指令
3、!!
就是执行上一个指令
4、Bash shell的操作环境
4.1、路径与指令搜索顺序
指令运作顺序
1、以相对路径/绝对路径执行指令,如/bin/ls 或 ./ls
2、有alias找到该指令来执行
3、由bash内建的指令来执行
4、透过$PATH这个变量的顺序搜索寻到的第一个指令来执行
4.2、bash的进站与欢迎讯息:/etc/issue,/etc/motd
进站欢迎信息,在/etc/issue里面
4.3、环境配置文件:login,non-login shell,/etc/profile,/.bash_profile,source,/.bashrc
1、系统有一些环境文件案的存在,让bash在启动时直接读取这些配置文件,以规划好bash的操作环境。而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好设置文件。想要保留设置,就得将这些设定写入配置文件;
2、login shell与non-login shell
login shell会读取这两个配置文件:
a)/etc/profile:这是系统整体的设定,你最好不要修改这个档案;
b) /.bash_profile或/.bash_login或~./profile:属于使用者个人设定,你要改自己的数据,就写入这里;
4.4、终端的环境设定:stty,set
stty可以帮助设定终端机按键代表意义
stty -a :将目前所有的stty参数列出来;
例如:stty erase ^h
set可以帮助我们设定整个指令输出/输入的环境
set 【-uvCHhmBx】
echo $- :显示目前所有的set设定值
4.5、通配符号与特殊符号
- 通配符
"* " :代表0个到无穷多个任意字符。
"?":代表一定有一个任意字符。
"[] " :同样代表一定有一个括号内的字符(非任意字符)。例如adcd代表一定有一个字符,可能是a,b,c,d这四个任何一个。
"[-] ":若有减号在中括号内,代表在编码顺序内的所有字符,例如0-9代表0到9之间的所有数字,因为数字的语系编码是连续的。
"[^]" :若中括号内的第一个字符为指数符号,那表示反向选择,例如[abc]代表一定有一个字符,只要非a,b,c的其他字符就接受的意思。- 特殊字符
“#”:批处理符号,这个最长被使用在script当中,视为说明!在后的数据均不执行
"":跳脱符号,将特殊字符或通配符还原成一般字符
"|":管线,分割两个管线命令的界定
";":连续指令下达分隔符,连续性命令的界定(注意!与管线命令并不相同)
"~":用户的家目录
"()
"()":在中间为子shell的起始与结束
"{}":在中间为命令区块的组合
5、数据流重导向
5.1、何为数据流重导向
数据流重导向:数据流重导向可以将standard output与stardard error output分别传送到其他的档案或装置区,而分别传送所用的特殊字符则如下所示
1、标准输入 stdin:代码未0,使用<或<<;
2、标准输出 stdout:代码未1,使用>或>>;
3、标准错误输出stderr:代码为2,使用2>或2>>;
例如:ll / > ~/rootfile
该档案建立方式:
1、该档案若不存在(如~/rootfile)若不存在,系统会自动的将他建立起来,
2、当这个档案存在的时候,系统会先将这个档案清空,然后再写入数据;
3、也就是若以>输出到一个已经存在的档案中,那个档案就会被覆盖掉;
例子:
find /home -name.bashrc > list_right 2> list_error
- /dev/null 垃圾桶黑洞装置与特殊写法
如果我们知道错误会发生,所以要将错误信息忽略掉而不显示或存储,这个/dev/null可以吃掉任何导向这个装置的信息
例如:
find /home -name.bashrc 2> /dev/null
如果要将正确与错误的数据统统写入同一个档案
find /home -name.bashrc > list 2>&1- standard input : < 与 <<
将原本需要有键盘输入的数据,改由档案内容来取代
使用命令输出重导向的必要性:
1、屏幕输出的信息很重要,而且我们需要将他存下来的时候;
2、背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
3、一些系统的执行命令的执行结果,希望他可以保存下来;
4、一些执行命令的可能已知错误讯息时,想以2> /dev/null将他丢弃掉;
5、错误讯息与正确信息的分别输出时;
5.2、命令执行的判断依据
想要一次执行多个指令方法
- cmd;cmd(不考虑指令相关性的连续下达指令)
例如:sync;sync;shutdown -h now- ?=0),则开始执行cmd2;
2、若cmd1执行完毕且为错误(?=0),则cmd2不执行;
2、若cmd1执行完毕且为错误($?!=0),则开始执行cmd2;
例如:ls /tmp/abc && touch /tmp/abc/hehe
ls /tmp/abc || mkdir /tmp/abc
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
一般来说,假设判断式有3个,也就是
command1 && command2 || command
6、管线命令
bash命令执行的时候又输出的数据出现,如果这群数据必须要经过几道手续之后才能得到我们所想要的格式,则可以使用管线命令。管线命令使用的是|这个界定符号。
管线命令仅会处理standard output,对于standard error output会予以忽略。
管线命令必须要能够接受来自前一个指令的数据成为standard input继续处理才行。
6.1、截取命令:cut,grep
cut的主要用途在于将同一行里面的数据进行分解,最长使用在分析一些数据或文字数据的时候。
例如: echo $PATH | cut -d ':' -f 3
cut是将一行讯息当中,取出某部分我们想要的,儿grep则是分析一行信息,若当中有我们所需要的信息,就讲该行拿出来。
例如:last | grep ’root‘
6.2、排序命令:sort,uniq,wc
sort 指令用于排序,而且可以依据不同的数据类型来排序;
unip 指令用于将重复的资料删除仅显示一个;
wc 指令用于计算这个档案里面有多少字,多少行,多少字符
6.3、双向重导向:tee
tee 指令用于在数据流处理过程中将某段信息保存下来;
6.4、字符转换命令:tr,col,join,paste,expand
tr 用于删除一段讯息当中的文字,或者是进行文字讯息的替换;
col 用来简单的奖tab按键取代成为空格;
join 处理两个档案之间的数据,而且,主要是在处理两个档案中,有相同数据的哪一行,才将他加在一起;
paste 直接将两行贴在一起,而且中间以tab键隔开;
expand 将tab按键转换成空格;
6.5、分割命令
split 将一个大档案,依据档案大小火行数来分割,将大档案分割成为小档案;
6.6、参数代换:xargs
产生某个指令的参数,xargs可以读入stdin的数据,并且以空格符或者断行符作为分辨,将stdin的资料分割成为arguments;
6.7、关于减号-的用途
管线命令在 bash 的连续处理程序中是相当重要癿!另外,在 log file 的分析当中也是相当重要的一 环, 所以请特删留意!另外,在管线命令当中,常常会使用到前一个指令的stdout 作为这次的
stdin , 某些指令需要用到文件名 (例如 tar) 杢迚行处理时,该 stdin 不 stdout 可以刟用减号 "-" 来替 代,