1、bash基础特性之命令历史:shell进程会在其会话中保存此用户提交执行过的命令,shell进程启动后所有当前执行过的命令都会保存在shell进程的内存中;只有用户登出时才保存到文件中。
(1)history命令
history命令用于查看已经运行过的命令
[root@hu lib]# history
1 su root
2 ls
3 cd /
4 poweroff
5 cd /
注意:在正常关机时shell进程内存中缓存的历史命令会保存在/root/.bash_history文件中
(2)定制history功能:可通过环境变量实现
(3)history格式:
history -c
:清空shell内存中缓存的历史命令
[root@hu lib]# history
1 history 10
2 history
3 history -d 2
4 history
[root@hu lib]# history -c
[root@hu lib]# history
1 history
history -d n
:指定删除第n条历史命令
history -c
:清空当前历史命令;
history -a
:将历史命令缓冲区中命令写入历史命令文件中;
history -r
:将历史命令文件中的命令读入当前历史命令缓冲区;
history -w
:将当前历史命令缓冲区命令写入历史命令文件中。
history number
:显示最近number条的命令
[root@hu lib]# history -c
[root@hu lib]# history
1 history
[root@hu lib]# history -r
[root@hu lib]# history
1 history
2 history -r
3 history
4 history -w
5 history
6 history -r
(4)调用命令历史列表中的命令
!number:再执行历史命令行中的第number条命令
!!:再一次执行上一条命令
! string:再一次执行命令历史列表中最近一次以string开头的命令
注意:命令重复执行依赖于幂等性
幂等性:对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的
(5)调用上一条命令的最后一个参数
先按ESC再按 · 号
字符串:!$
(6)控制命令历史记录方式由环境变量HISTCONTROL变量记录其方式,记录方式有以下几种
ignoredups:忽略重复命令
ignorespace:忽略以空白字符开头的命令
ignoreboth:以上两者同时生效
(7)修改变量的值
[root@hu lib]# echo $HISTCONTROL
ignoredups
[root@hu lib]# HISTCONTROL=ignoreboth
[root@hu lib]# echo $HISTCONTROL
ignoreboth
2、bash常见特性之命令补全
(1)shell程序在接收到用户执行命令请求,分析完成后,最左侧的字符串会被当做命令
(2)命令查找机制:
a、查找内部命令
b、据PATH环境变量中设定的目录,自作而右逐个搜索目录下的文件名:
若打头字符串能唯一表示命令程序文件,则直接补全
若不能唯一标识则再次敲击Tab会给出以大头字符串开头的列表
(3)路径补全
给定起始路径下,以对应路径下的打头字符串逐一匹配起始路径下的每个文件
若能唯一标识某个路径,则直接补全
否则再一次敲击Tab,给出列表
3、bash基础特性之命令行展开
(1)~:次符号自动展开为用户家目录,或指定用户的家目录
[root@hu recover]# cd ~hu
[root@hu hu]# pwd
/home/hu
[root@hu hu]# cd ~
[root@hu ~]# pwd
/root
(2){}:可承载一个以逗号分隔的路径列表,并能将其展开为多个路径
[root@hu recover]# mkdir -pv ./test/{a,b,c}
mkdir: created directory ‘./test/a’
mkdir: created directory ‘./test/b’
mkdir: created directory ‘./test/c’
[root@hu recover]# mkdir -pv {a,b}_{c,d}
mkdir: created directory ‘a_c’
mkdir: created directory ‘a_d’
mkdir: created directory ‘b_c’
mkdir: created directory ‘b_d’
4、bash基础特性之命令执行状态结果
(1)命令执行状态结果:bash通过状态返回值输出此结果
(2)如何查看结果
[root@hu ~]# echo $?
0
若查询结果为0则表示成功
若查询结果为1~255则表示失败
==注意:命令执行完成之后应立即查看其状态;因状态返回值保存于bash的特殊变量中——$?之下
(3)引用命令执行结果
a、[root@hu ~]# echo $(command)——执行时先执行$()后执行echo
b、[root@hu ~]# echo $`command`——使用反引号,先执行反引号内容,后执行echo
5、bash基础特性之引用
1、弱引用:" "
2、强引用:' '
3、命令引用:$() 反引号
6、bash基础特性之快捷键
Ctrl+a:跳转至命令首行
Ctrl+e:跳转至命令行尾
Ctrl+u:删除命令首行到光标处之间所有字符
Ctrl+k:删除光标到行尾之间的所有字符
Ctrl+L:清屏
Ctrl+c:终止命令
7、bash基础特性之通配符机制
(1)globing:文件名通配——一种匹配模式,整体文件名匹配,而非部分匹配!
(2)匹配模式:能实现对多个文件名同时进行匹配(如etc下所有以p开头的目录)
[root@hu recover]# ll -d /etc/p*
drwxr-xr-x. 2 root root 4096 Oct 11 08:59 /etc/pam.d
-rw-r--r--. 1 root root 2392 Nov 26 07:39 /etc/passwd
-rw-r--r--. 1 root root 2433 Nov 26 07:38 /etc/passwd-
-rw-r--r--. 1 root root 1362 Jun 9 2014 /etc/pbm2ppa.conf
-rw-r--r--. 1 root root 2872 Jun 10 2014 /etc/pinforc
(3)通配符的元字符
A、*
:匹配任意长度的任意字符
[root@hu recover]# ll -d /etc/p*
drwxr-xr-x. 2 root root 4096 Oct 11 08:59 /etc/pam.d
-rw-r--r--. 1 root root 2392 Nov 26 07:39 /etc/passwd
B、?
:匹配任意单个字符
[root@hu recover]# ll -d /etc/p?
drwxr-xr-x. 5 root root 4096 Oct 11 08:36 /etc/pm
C、[ ]
:匹配指定范围内任意单个字符,有以下几种情况
第一种表达式
[a-z]:所有的小写字母
[A-Z]:所有的大写字母
[0-9]:数字
[a-z0-9]:字母和数字
[root@hu recover]# ls /bin/ps[0-9]*
/bin/ps2ascii /bin/ps2pdf /bin/ps2pdf13 /bin/ps2pdfwr /bin/ps2ps2
/bin/ps2epsi /bin/ps2pdf12 /bin/ps2pdf14 /bin/ps2ps
第二种表达式
[[:upper:]]:表示所有大写字母
[[:alnum:]]:表示所有字母和数字
[[:alpha:]]:表示所有字母
[[:digit:]]:表示所有数字
[[:lower:]]:表示所有小写字母
[[:punct:]]:表示所有标点符号
[[:space:]]:表示所有空白字符
注意:上面式子仅仅只能表示一位通配符,如有多位则写多个格式
[root@hu recover]# ll /bin/ps[[:alnum:]]*
-rwxr-xr-x. 1 root root 740 Mar 5 2015 /bin/ps2ascii
-rwxr-xr-x. 1 root root 2794 Mar 5 2015 /bin/ps2epsi
D、[^]:匹配指定范围内以外的任意单个字符
[root@hu recover]# ll /bin/ps[^[:digit:]]*
-rwxr-xr-x. 2 root root 53329 Nov 19 2015 /bin/psed
lrwxrwxrwx. 1 root root 9 Oct 11 08:48 /bin/psfaddtable -> psfxtable
lrwxrwxrwx. 1 root root 9 Oct 11 08:48 /bin/psfgettable -> psfxtable
8、I/O重定向及管道
(1)程序=数据+指令
(2)数据来源:
a、程序内部变量而来,数据量和变动量
b、文件提供数据
(3)程序都有IO
a、可输入设备:文件
(键盘设备,系统上常规文件,网卡等)
b、可用于输出的设备:文件
(显示器文件系统上的常规文件、网卡的等)
(4)、程序数据流有以下三种情况
a、输入的数据流:标准输入(stdin)——例键盘
b、输出的数据流:标准输出(stdout)——如显示器
c、错误输出流:错误输出(stderr)——比如显示器
(5)、文件描述符——fd——file descriptor
标准输入——0
标准输出——1
错误输出——2
(6)、I/O重定向
输出重定向
A、覆盖输出重定向:将输出的地方使用“>”符号可以更改定义到任何存储地方
比如:使用cat命令本来应该讲结果输出到显示器上,使用“>”后就可以将其定义输出到文件中,而不在显示器上显示。且定义的文件原内容会被输出内容所覆盖。
[root@hu io]# cat test.txt
123243
[root@hu io]# cat test1.txt > ./test.txt
[root@hu io]# ls
test1.txt test.txt
[root@hu io]# cat test.txt
one
two
three
listen
new
B、追加输出重定向:使用“>>”符号将输出内容定义到文件中,且仅仅是在目标文件尾部加上此次输出的内容,并不覆盖原内容。如下所示
[root@hu io]# cat test1.txt >> test.txt
[root@hu io]# cat test.txt
123534
one
two
three
listen
new
lie
C、错误输出重定向
2 >:错误覆盖输出重定向
[root@hu io]# set -c 2>test1.txt
[root@hu io]# cat test1.txt
-bash: set: -c: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
2 >>:错误追加输出重定向
[root@hu io]# set -c 2>>test.txt
[root@hu io]# cat test.txt
one
two
three
listen
new
lie
believe
let
better
much
-bash: set: -c: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
D、合并标准输出重定向和错误输出重定向
&>:合并覆盖标准输出重定向
[root@hu io]# cat ./tt.txt > test.txt 2>&1
cat: ./tt.txt: No such file or directory
&>>合并追加标准输出重定向
[root@hu io]# cat ./tt.txt >> test.txt 2>&1
[root@hu io]# cat test.txt
cat: ./tt.txt: No such file or directory
cat: ./tt.txt: No such file or directory
cat: ./tt.txt: No such file or directory
cat: ./tt.txt: No such file or directory
输入重定向
A、输入重定向使用 < 符号
[root@hu io]# tr sufc SUFC < ./test.txt >> test1.txt //将test.txt中内容输入时将其内部指定的小写字母转换为大写字母后重定向输出到test1.txt中。
[root@hu io]# cat test.txt
cat: ./tt.txt: No such file or directory
Cat: ./tt.txt: No SUCh File or direCtory
B、<<并不是输入追加,而是Here Document——即将键盘输入的显示出来,或者重定向添加至文件中
a、cat << END
END:从键盘输入重定向到文件中
b、cat << EOF
EOF:在文件中写入内容在两个EOF之间用于输出提示
[root@hu io]# cat >>test1.txt << end //将键盘输入的字符重定向输入到test1.txt文件中,以end结束输入
> test1
> test112
> test23
> test5443
> ejgjgiodjfgoi
> end
[root@hu io]# cat test1.txt
test1
test112
test23
test5443
ejgjgiodjfgoi
(7)管道符
A、作用:连接程序,实现将前一个程序命令的输入直接定向后一个程序输入
B、格式:command1 |command2 |command3 ...
注意:特殊设备:/dev/null;不管什么数据送到此设备中都会被清空
9、bash特性之命令hash
1)、bash脚本编程
终端:附着在终端的接口程序
GUI:KDE 、Gnome、xfce
CLI:/etc/shells(bash、csh、zsh)
2)、hash命令:(对内部命令无效——对内部命令的记录无效)在PATH路径中保存已经执行过命令的完整路径,下次再执行此命令时就直接使用此处路径而不用查找PATH全部路径。
3)、hash使用
(1)使用格式
hash [-lr] [-p pathname] [-dt] [name ...]
(2)option
hash:无参数时为查看hash表
[root@hu ~]# hash
hits command
1 /usr/bin/mktemp
hash -d:后面加命令,清除指定hash表命令
hash -r:清空所有hash表
(3)、hash缓存机制:key—value(建值数据)
key:查找标准——搜索键
value:查找结果——值
10、bash特性之变量——为程序提供数据
1)、程序:由指令+数据(另一种描述:算法+数据结构)
指令:有程序文件提供
数据:标准输入(IO设备)、文件、管道
(变量名称其实是指一段内存空间)
2)、变量:由其所指变量+存储内存空间组成
a、变量赋值:——不同于bash方式
name=value(存储到该变量名所指内存)
b、变量类型:(指变量存储中值的类型)存储格式、表示数据范围、参与运算
c、编程语言类型:
强类型变量:规定的是哪种类型就不能改变或和其他类型运算(强类型一般需要先声明)——C语言
弱类型变量:bash弱类型将所有变量统统视作字符型
(bash不支持浮点行数据,若需要使用只能借助外部变量;bash变量无须先声明,bash变量需要先初始化避免其随机值)
例:
[root@hu ~]# test1=2345
[root@hu ~]# echo $test1
2345
3)、变量替换:将变量名所出现的地方转换为变量名所指内存空间数据的过程
4)、变量引用:
格式—${var-name} 或 $var-name
5)、变量名:变量名只由数字、字母、下划线组成,且不能由数字开头
变量名名命名法则:见名知意,命名机制遵循某种法则;且不能使用程序的保留名(如:if、else、then)
6)、bash变量类型(据作用范围分为:本地、环境、局部、位置、特殊)
A、本地变量:shell作用域仅限于当前shell——如alias就仅仅限于当前shell
a、变量赋值:name=value
b、变量引用:
${name}、$name
" ":弱引用变量名会替换为其值
' ':强引用变量名不会替换为其值
c、查看变量:set
撤销变量:unset name(此处非变量引用不能加$)
B、环境变量:作用域为当前shell及其子shell进程
a、变量赋值:
export name=value
name=value
export name
declare -x name=value
declare -x name
b、变量引用:${name}、$name
注意:bash内嵌了许多环境变量,用于定义bash的工作环境——通常为大写的字母
如:PATH HISTSIZE HISEFILE
c、查看环境变量:export、declare -x、printenv、env
撤销环境变量:unset name
d、只读变量——c中常量,不允许随意改变其值
格式:declare -r name
readonly name
注:只读变量无法重新赋值,并且不支持撤销,shell进程结束后自动消失
C、局部变量:作用域仅为某代码片段——函数上下文(周期之内)
D、位置参数变量:向执行脚本的shell进程传递参数
E、特殊变量:shell内置有特殊功能的变量(如:$?中保存了上一个命令执行的状态——0表示成功,1~255表示失败)
11、bash特性之多命令执行
1)、多命令执行格式
~]# command1 command command .....
命令执行顺序从左到右依次执行
2)、逻辑运算
(1)运算数只有真假
真=>true、yes、1
假=>no、off、0
(2)几种逻辑运算
与——>&
或——>+
非——>!
异或
a、短路法则
例:表示将两个命令做与运算
~]# command1 && command2
若command1—假,则command2不会再执行
若command1—真,则command2必须执行
[root@hu ~]# cat test.txt && touch test.txt
cat: test.txt: No such file or directory
[root@hu ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Video
例:表示两个命令做或运算
~]# command1 || command2
若command1—假,则command2必须执行
若command1—真,则command2不会再执行
[root@hu ~]# cat test.txt || rm -rf test.txt
[root@hu ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Videos
Desktop Downloads Music Public test.txt
12、shell编程的实现
1、编程语言的分类——据其运行方式分为以下两类
1)、编译运行:源代码由编译器转换为二进制程序文件,然后运行程序文件——编译器不参与文件运算
2)、解释运行:源代码运行时启动解释器程序,由解释器检查逻辑无误后解释一句运行一句——边解释边运行
2、据其编程过程中功能的实现是调用库还是调用外部程序文件
1)、shell脚本编程:利用系统上的命令及编程组件进行编程
2)、完整编程:利用库或编程组件进行编程
3、据编程模型分类
1)、过程式编程语言:以指令为中心来组织代码,数据是服务于代码
2)、对象的编程语言:以数据为中心来组织代码,指令是服务于数据
——对象:一个对象代表一种数据类型、模式
——类(class):实例化为对象
4、shell脚本编程特性:过程式编程;依赖外部程序文件运行
5、如何写shell脚本
1)、脚本第一行顶格;给出shebang——解释器路径,用于指明解释器执行当前脚本的解释器程序文件
2)、常见解释器
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
6、shell脚本是什么:命令堆积——许多命令不具有幂等性,需要程序逻辑来判断运行条件是否满足,以避免运行中发生错误。
7、如何运行脚本
1)、赋予可执行权限,并直接运行此程序文件
赋予可执行权限:chmod +x test.sh
在相对路径下运行:./test.sh
2)、直接用解释器来运行
如:bash test.sh
注意:
a、脚本中空白行会被解释器忽略
b、脚本中除了shebang,余下的所有以#开头的都会被视作注释行而忽略
c、shell脚本中的运行时通过运行一个子shell进程实现的
pstree:用于查看进程树
13、bash的配置文件
1、bash配置文件分为两个大类
A、profile类:为交互式登录的shell进程提供配置
B、bashrc类:为非交互式登录的shell进程提供配置
2、登录类型
A、交互式登录:直接通过某终端输入账号、密码后登录打开的shell进程,或使用su命令(su - username;su -l username)格式执行的登录切换
交互式登陆的执行流程:/etc/profile ---> /etc/profile.d ---> ~/bash_profile ---> ~/bashrc ---> /etc/bashrc。
B、非交互式登录:使用su username格式执行的登录切换,图形界面下打开的终端运行脚本的时候
非交互式登陆的执行流程:~/.bashrc ---> ~/.bash_profile ---> /etc/profile.d/*.sh
3、bash配置文件详解
1)、profile类文件
A、全局配置:对所有用户都生效(所有文件:/etc/profile、/etc/profile.d/*.sh)
a、/etc/profile文件:Linux/etc/profile文件的改变会涉及到系统的环境,也就是有关Linux环境变量的东西,学习Linux要了解Linuxprofile文件的相关原理,这里对则以文件进行具体分析。
b、/etc/profile.d/*.sh:目录中存放的是一些应用程序所需的启动脚本,其中包括了颜色、语言、less、vim及which等命令的一些附加设置。
这些脚本文件之所以能够 被自动执行,是因为在/etc/profile 中使用一个for循环语句来调用这些脚本。而这些脚本文件是用来设置一些变量和运行一些初始化过程的。
B、用户个人仅对当前用户有效—— ~/.bash_profile
C、
a、用于定义环境变量
b、运行命令或脚本
2)、bashrc类
A、全局配置——/etc/bashrc
B、用户个人配置—— ~/.bashrc
C、功能:
a、定义本地变量进程
b、定义命令别名
注意:仅管理员可修改全局配置文件
命令行中定义的特性,如变量和别名作用域为当前shell进程的生命周期;配置文件定义的特性仅针对随后新启动的shell进程有效
3)、如何让配置文件定义的特性立即生效
a、通过命令行重复定义一次
b、让shell进程重读配置文件
~]# source /path form file
~]# ./path/
注意:如何让定义的配置永久生效:在/.bashrc中添加配置