shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。简称sh。
记录命令历史
我们执行的命令Linux都会记录,保存在用户的家目录的bash_history文件中。(注意:只有用户正常退出shell)
!!:表示执行上一条指令
!n:n是数字,表示执行命令历史中的第n条指令
!字符串(字符串大一等于1):表示执行命令历史中最近一次以此字符串开头的命令
命令和文件名补全
tab键:可以补全一个指令、一个路径或者一个文件名。
连续按两次tab键,系统会把所有的命令或者文件名都列出来
别名
alias:可以把一个很长的指令另取名为一个简单易记的指令(直接执行,会看到目前系统预设的别名)
unalias:解除别名功能
# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
自定义命令的别名
# alias aming='pwd' //自定义pwd命令的别名
# aming
/root
# unalias aming //解除pwd的别名
# aming
bash: aming: 未找到命令...
输入/输出重定向
输入重定向:改变命令的输入,命令为<
输出重定向:改变命令的输出,常用于将命令的结果输入到文件中,而不是屏幕,命令为>
# mkdir /tmp/10
# cd /tmp/10
# echo "123" > 1.txt
# echo "123" >> 1.txt // >>为追加重定向
# cat 1.txt
123
123
作业控制
当运行进程时,Ctrl+Z组合键可以使它暂停,使用fg(foreground的简写)命令可以恢复它,或利用bg(background的简写)命令使它到后台运行。Ctrl+C组合键可以终止运行。
多个被暂停的任务会有编号,使用jobs命令可以看到任务。使用bg命令或者fg命令时,则需要在后面加编号。
如果想要关掉后台运行的任务,有两种情况。第一种情况是没有退出刚才的shell时,先使用fg命令把任务调到前台,然后用Ctrl+C组合键结束任务。另一种情况是使用jobs命令并不会显示在后台运行或被暂停的任务,想要关闭这些任务,则需要先知道它们的pid。如果忘记这个pid。可以使用ps aux命令找到该进程
# vmstat 1 > /tmp/1.log & //vmstat 1命令用来观察系统的状态,加&会显示pid信息。
[2] 2683
# ps aux |grep vmstat
root 2683 0.0 148308 1372 pts/0 S 21:15 0:00 vmstat 1
# kill 2683 //用kill命令结束进程。如果无法结束,加-9选项。即kill -9 [pid]
变量
变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。
环境变量PATH,就是shell预设的一个变量,PATH就是代替了所有常用命令的绝对路径的设定。有了这个变量,我们运行某个命令时,就不再需要输入全局路径,直接输入命令名即可。shell预设的变量都是大写的。
# echo $PATH
/user/local/sbin:/usr/local/bin:/user/sbin:/usr/bin:/root/bin
# echo $HOME
root
# echo $PWD
/root
# echo $LOGNAME
root
命令env
# env //可列出系统预设的全部系统变量
登陆不同的用户,环境变量的值也不同。env命令显示的变量只是环境变量。
常见的环境变量:
HOSTNAME:主机的名称
SHELL:当前用户的shell类型
HISTSIZE:历史记录数
MAIL:当前用户的邮件存放目录
PATH:该变量决定了shell将到哪些目录中寻找命令或程序
PWD:当前目录
LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量
HOME:当前目录的家目录
LOGNAME:当前用户的登录名
命令set
可以输出环境变量,而且不仅可以显示系统预设的变量,也可以显示用户自定义的变量。自定义变量只能在当前shell中生效
# myname=Aming //自定义变量
# echo $myname
Aming
# set |grep myname
myname=Aming
# echo $myname
Aming
# bash //执行该命令,会进入一个子shell环境中
# echo $myname //先前设置的myname变量已经不存在
# exit //退出当前shell会到原来的shell
exit
# echo $ myname
Aming
# abc=123
# echo $abc
123
# bash
# echo $abc
# exit
exit
# export abc //export命令就是声明一下这个变量,让该shell的子shell也知道变量abc的值是123
# echo $abc
123
# bash
# echo $abc
123
# exit
exit
# echo $abc
123
# unset abc //unset命令用来取消某个变量
# echo $abc
让设置的环境变量一直生效
- 允许系统内所有用户登录后都能使用该变量
# echo "export myname=Aming" >> /etc/profile //在/etc/profil文件最后一行加入export myname=Aming
# source !$ //运行文件
source /etc/profile
# bash
# echo $myname
Aming
# exit
# su - test //切换其他账户
$ echo $myname
Aming
- 仅允许当前用户使用该变量
# echo "export myname=Aming" >> .bashrc //添加到用户的主目录下的.bashrc文件最后一行
# source !$
source .bashrc
# su - test //切换其他账户
$ echo $myname
Aming
在Linux下设置自定义变量的规则
设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格
变量名只能由字母、数字以及下划线组成,而且不能以数字开头
当变量内容带有特殊字符(如空格)时需要加上单引号。变量内容中本身带有单引号,则需要加双引号。
# myname='Aming Li'
# echo $myname
Aminng Li
# myname=`pwd` //变量内容需要用到其他命令,运行结果可以使用反引号
# echo $myname
/root
# myname="$LOGNAME"Aming //累加其他变量,需要加双引号
# echo $myname
rootAming
系统环境变量与个人环境变量的配置文件
/etc/profile:预设了几个重要的变量。例如PATH、USER、LOGNAME、MAIL、INPUTRC等
/etc/bashrc:这个文件主要预设umask以及PS1。PS1就是我们在输入命令前面的那串字符。例如:[root@localhost ~]#。
.bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
.bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。例如,你可以将用户自定义的别名或者自定义变量写到这个文件中。
.bash_history:该文件用于记录命令历史。
.bash_logout:当退出shell时,会执行该文件。你可以将一些清理的工作放到这个文件中。
shell中的特殊符号
“*”、“?”这两个符号属于通配符
- *:代表零个或多个任意字符
# ls /tmp/4_6/test*
/tmp/4_6/test1 /tmp/4_6/test111 /tmp/4_6/test4
- ?:只代表一个任意字符
# touch /tmp/4_6/testa
# ls /tmp/4_6/test?
/tmp/4_6/test1 /tmp/4_6/test4 tmp/4_6/testa
- 注释符号#:在Linux中表示注释说明,即#后内容会被忽略
# abc=123 #aaaa
# echo $abc
123
- 脱义字符
\
:会将后面的特殊符号还原为普通字符。
# ls -d test\*
ls:无法访问test*:没有那个文件或目录
- 管道符 |:用于将前一个指令的输出作为后一个指令的输入
- 命令cut:用来截取某一个字符。
格式:
cut -d ‘分割字符’ [-cf] n //n这里是数字
选项:
-d:后面跟分割字符,分割字符要用单引号括起来
-c:后面接的是第几个字符
-f:后面接的是第几个区块
# cat /etc/passwd|cut -d ':' -f 1 |head -5 //冒号作为分割字符,-f 1表示截取第一段
root
bin
daemon
adm
lp
# head -n2 /etc/passwd|cut -c2 //读取文件内容前两行截取文件内容前两行的第二个字符
o
i
# head -n2 /etc/passwd|cut -c1 //读取文件内容前两行截取文件内容前两行的第一个字符
r
b
# head -n2 /etc/passwd|cut -c1-10 //读取文件内容前两行截取文件内容前两行的第1到第10个字符
root:x:0:0
bin:x:1:1
# head -n2 /etc/passwd|cut -c1,3,10 //读取文件内容前两行并截取文件内容前两行的第1,3,10个字符
ro0
bn:
- 命令sort:用于排序
格式:
sort [-t 分隔符] [-kn1,n3] [-nru]
选项:
-t:后面跟分隔符。
-n:表示使用纯数字排序。
-r:表示反向排序。
-u:表示去重复。
-kn1,n2:表示n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。
如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。
# head -n5 /etc/passwd|sort -t: -k3 -n
# head -n5 /etc/passwd|sort -t: -k3,5 -r
- 命令wc:用于统计文档的行数、字符数或词数。
-l:统计行数
-m:统计字符数
-w:统计词数
# wc /etc/passwd //不加选项,直接跟文档,则会把行数、词数、字符数依次输出
45 90 2361 /etc/passwd
# wc -l /etc/passwd
45 /etc/passwd
# wc -m /etc/passwd
2361 /etc/passwd
# wc -w /etc/passwd
90 /etc/passwd
- 命令uniq:用来删除重复的行。
-c选项比较常用,表示统计重复的行数,并把行数写在前面。
# vim testb.txt //把下面的内容写入testb。txt并保存
111
222
111
333
# uniq testb.txt //使用前,必须先给文件排序,否则不管用
# sort testb.txt |uniq
111
222
333
# sort testb.txt |uniq -c //-c统计重复的行数,并把重复的行数写在前面
2 111
1 222
1 333
- 命令tee:类似于重定向>,但比它多一个功能,即把文件写入后面所跟的文件时,还显示在屏幕上。常用于管道符|后。
# echo "aaaaaaa" |tee testb.txt
aaaaaaa
# cat testb.txt
aaaaaaa
- 命令tr:用于替换字符。
-d:表示删除某个字符,后面跟要删除的字符
-s:表示删除重复的字符
常用于把小写字母变成大写字母
# head -n2 /etc/passwd |tr '[a-z]' '[A-Z]'
# grep 'root' /etc/passwd |tr 'r' 'R'
替换、删除以及重复等操作都是针对一个字符串来讲,有一定的局限性。针对字符串就不能使用了。
- 命令split:用于切割文档
-b:表示依据大小来分割文档,单位为byte
# mkdir split_dir
# cd !$
cd split_dir
# cp /etc/passwd ./
# split -b 500 passwd
# ls
passwd xaa xab xac xad xae
如果split不指定目标文件名,则会xaa、xab…这样的文件名来存取切割后的文件。我们也可以指定文件名。
# rm -f xa*
# split -b 500 passwd 123
# ls
123aa 123ab 123ac 123ad 123ae passwd
-l:表示依据行数来分割
# rm -f 123a*
# split -l 10 passwd
45 passwd
10 xaa
10 xab
10 xac
10 xad
5 xae
90 总用量
- 特殊符号$:用作变量前面的标识符。
- 特殊符号;:在一行中运行两个或两个以上的命令,需要在命令之间加这个符号。
# mkdir testdir ; touch test1. txt ; touch test2.txt ; ls -d test*
- 特殊符号~:表示用户的家目录
# cd ~
# pwd //root用户的家目录
/root
# su aming
$ cd ~
$ pwd
/home/aming //普通用户的家目录
- 特殊符号&:把一条命令放在后台执行。
- 重定向符号>、>>、2>和2>>
重定向符号>和>>分别表示取代和追加的意思。
重定向符号2>和2>>分别表示错误重定向和错误追加重定向
# ls aaa
ls:无法访问aaa:没有那个文件和目录
# ls aaa 2> /tmp/error
# cat /tmp/error
ls:无法访问aaa :没有那个文件和目录
# ls aaa 2>> /tmp/error
# cat /tmp/error
ls:无法访问aaa :没有那个文件和目录
ls:无法访问aaa :没有那个文件和目录
- 中括号[]:中括号内为字符组合,代表字符组合中的任意一个。可以是一个范围(1-3 ,a-z)
# cd /tmp/10
# ls -d test*
test1.txt test2. txt testb. txt testdir
# ls -d test[1-3].txt
test1. txt test2.txt
# ls -d test[12b].txt
test1. txt test2.txt testb. txt
# ls -d test[1-9a-z].txt
test1. txt test2.txt testb. txt
- 特殊符号&&和||:用于多条命令中间
command1 ; command2 不论command1是否执行成功,都会执行command2
command1 && command2 只有command1执行成功,才会执行command2,否则command2不执行
command1 || command2 command1执行成功则command2不执行,否则执行command2。即两条命令中总有一条命令会执行