1、shell基础知识
1.1什么是shell
简介:shell是系统跟计算机应硬件交互时使用的,中间介质,它只是系统的一个工具。
1.1.1记录命令历史
①!!:连续俩个!表示执行上一条指令。
②!n :这里n表示的是数字,表示执行命令历史中的第n条命令。
③!字符串(字符串大于等于1):例如!pw表示执行历史中最近以pw开头的命令。
1.1.2命令和文件名补全
tab:键tab可以补全一个指令,路径,或者一个文件名。
1.1.3 别名
简介: 可以通过alias把一个常用的取名为另一个指令,也可利用unalias命令解除别名功能。
1.1.4 通配符
在bash下,可以使用*来匹配零个或者多个字符, 用?匹配一个字符。
1.1.5 输出/输入重定向
简介:输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>。另外,还有重定向命令2>以及追加重定向>>。
1.1.6 管道符
简介:它用于将前一个指令的输出作为后一个指令的输出
cat /etc/passwd|wc -l
1.1.7作业控制
简介:当运行进程时,可以使用它暂停(ctrl+z组合键),然后使用fg(foreground的简写)命令恢复它,或者利用bg(background)命令使它到后台运行。此外也可使它终止(ctrl+c)
1.2变量
简介:变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。
1.2.1命令env
使用命令env,可列出来系统预设的全部系统变量。
·HOSTNAME:表示主机的名称。
·SHELL:表示当前用户的shell类型。
·HISTSIZE:表示历史记录数。
·MAIL:表示当前用户的邮件存放目录。
·PATH:该变量决定了shell将到哪些目录中寻找命令或程序。
·PMD:表示当前目录。
·LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量。
·HOME:表示当前用户的家目录。
·LOGNAME:表示当前用户的登录名。
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预
设的全部变量都显示出来。
1.2.2命令set
set和env命令类似,也可以输出环境变量
set命令不仅可以显示系统预设的变量,也可以显示用户自定义的变量。
例如:myname=Aming
echo $myname
set |grpe myname
myname=Aming
允许系统内所有用户登录后都能使用该变量
操作方法:
# echo"export myname=Aming”>> /etc/profile //追加命令到文件中
#source !$
source /etc/profile //输出内容
# bash
# echo $myname
Aming //输出内容
# exit
exit //输出内容
# su - test //切换用户查看效果
$ echo $myname
Aming
·仅允许当前用户使用该变量。
操作方法:在用户主目录下的.bashrc文件的最后一行加入export myname=Aming,然后运行source .bashrc就可以生效了。(source命令的作用是将目前设定的配置刷新,既不用注销在登录也能生效)
·设定变量的格式为a=b,其中a为变量名,b为变量内容,等号俩边不能有空格。
·变量名只能由字母、数字及下划线组成,而且不能以数字开头。
·当变量内容带有特殊字符(如空格)时,需加上单引号。
特殊情况:如变量本身内容有单引号,需加上双引号。
变量内容中需要用到其他命令,运行结果加反引号。
变量内容可累加到其他变量内容的内容,但需加双引号。
如果不小心把双引号错加为单引号,则得不到想要的结果。
1.3系统环境变量与个人环境变量的配置文件
/etc/profile:这个文件预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE,umask等。
/etc/bashra :这个文件预设umask以及ps1。这个ps1就是我们再输入命令时前面的那串字符。
.bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可以使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
.bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。
.bash_history:该文件用于记录命令历史。
.bash_logout:当退出shell时,会执行该文件。可以将一些清理的工作放到该文件中。
1.4 Linux shell 中的特殊符号
1.4.1 *代表零个或者多个任意字符
例:ls /tmp/4_6/test*
1.4.2 ?只代表一个任意字符
1.4.3 注释符号 #
#后面的内容都会被忽略
abc=123 #aaaa
echo $abc
1.4.4 脱衣字符
这个字符会将后面的特殊符号(如*)还原为普通字符。
1.4.5 再说管道符|
作用:将前面命令输出作为后面命令的输入。
cat testb.txt |wc -l //wc -l用来计算一个文档有多少行
1.4.6 命令cut
作用:用来截取某一个字段,其格式为cut -d ‘分割字段’ [ -cf ] n,n是数字。
-d:后面跟分割字符,分割字符用单引号
-c:后面接的是第几个字符
-f:后面接第几个区块
用法:cat /etc/passwd|cut -d ':' -f 1 |head -5
head -n2 /etc/passwd|cut -c2
head -n2 /etc/passwd|cut -c1,3,10 (-c选项后面可以是一个数字n,也可以是一个区间n1~n2,还可以是多个数字)
1.4.7命令sort
命令sort用作排序,其格式为sort [- t 分隔符 ] [ -kn1,n2 ] [ -nru ]n1和n2指的是数字。
-t:后面跟分隔字符,作用跟cut的-d选项一样
-n:表示使用纯数字排序
-r:表示反向排序
-u:表示去重复
-kn1,n2:表示由n1区间排序道n2区间,可以只写-kn1,即对n1字段排序。
如果sort不加选项,则从首字符后依次按ASCII码进行比较,最后按升序输出。
head -n5 /etc/passwd|sort
head -n5 /etc/passwd |sort -t: -k3 -n
1.4.8命令 wc
用于统计文档的行数,字符数或词数。该命令常用选项有-l(统计行数)、-m(统计字符)和-w(统计词数)。
wc /etc/passwd
wc -l /etc/passwd
wc -m /etc/passwd
wc -w /etc/passwd
1.4.9命令 uniq
命令uniq用来删除重复行,该命令只有选项-c常用,它表示统计重复的行数,并把行数写在前面。
测试:vim testb.txt
111
222
111
333 //写入内容
sort testb.txt |uniq
sort testb.txt |uniq -c
1.4.10 命令tee
tee命令后面跟文件名,其作用类似于重定向>,但它比重定向多一个功能,即把文件写入后面所
根的文件时,还显示在屏幕上。该命令常用于管道符|后。示例命令如下:
# echo "aaaaaaaaaaaaaaaaaaaaaaaaaaa” |tee testb.txt
aaaaaaaaaaaaaaaaaaaaaaaaaaa
# cat testb.txt
aaaaaaaaaaaaaaaaaaaaaaaaaaa
1.4.11 命令 tr
tr命令用于替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的符号~M。该命令
常用的选项有以下两个。
-d:表示删除某个字符,后面跟要删除的字符。
-s:表示删除重复字符。
tr命令常用于把小写字母变成大写字母。
tr命令还可以替换一个字符。
grep '111' testb.txt |tr '1' '4'
1.4.12 命令 split
split命令用于切割文档,常用的选项为-b和-l。
-b:表示依据大小来分割文档,单位为byte,示例命令如下:
mkdir split_dir
cd !$
cp /etc/passwd ./
split -b 500 passwd
ls
如果split不指定目标文件名,则会以xaa、xab...这样的文件名来存取切割后的文件。当然,我们也可以指定目标文件名,如下所示:
# rm -f xa*
split -b 500 passwd 123
ls
-l:表示依据行数来分割文档,示例命令如下:
rm -f xa*
split -l 10 passwd
wc -l *
1.4.13 特殊符号$
符号$可以用作变量前面的标识符,还可以和!结合起来使用。示例命令如下:
cd ..
ls testb.txt
testb.txt
ls !$
ls testb.txt
testb,txt
!$表示上条命令中的最后一个变量,本例中上条命令最后是testb.txt,那么在当前命令下输入!$则
代表testb.txt。
1.4.14 特殊符号;
通常,我们都是在一行中输入一个命令,然后回车就运行了。如果想在一行中运行两个或两个以
上的命令,需要在命令之间加符号;。示例命令如下:
# mkdir testdir ; touch test1.txt ; touch test2.txt; ls -d test*
test1.txt test2.txt testb.txt testdir
1.4.15 特殊符号~
符号~表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username。示例命令如下:
cd ~
pwd
root
su aming
$ cd ~
$pwd
/home/aming
1.4.16 特殊符号&
把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况。比
如,可以用在sleep后,如下所示:
sleep 30 &
# jobs
1.4.17 重定向符号>、>>、2>和2>>
前面讲过重定向符号>和>>,它们分别表示取代和追加的意思。当我们运行一个命令报错时,报
错信息会输出到当前屏幕。如果想重定向到一个文本,则要用重定向符号2>或者2>>,它们分别表示
错误重定向和错误追加重定向。示例命令如下:
# 1s aaaa
1s:无法访问aaaa:没有那个文件或目录
# ls aaaa 2> /tmp/error
# cat /tmp/error
1s:无法访问aaaa:没有那个文件或目录
# ls aaaa 2>> /tmp/error
# cat /tmp/error
15:无法访问aaaa:没有那个文件或目录
ls:无法访问aaaa:没有那个文件或目录
10.4.18 中括号[]
中括号内为字符组合,代表字符组合中的任意一个,可以是一个范围(1-3,a-z),用法如下:
cd /tmp/10
ls -d test*
ls -d test[1-3].txt
ls -d test[12b].txt
ls -d test[1-9].txt
ls -d test[1-9a-z].txt
10.4.19 特殊符号8&和||
前面提到了分号可作为多条命令间的分隔符,其实还有两个可以用于多条命令中间的特殊符号,
那就是&&和||。
·command1 ; command2
·command1 8& command2
·command1 || command2
使用;时,不管command1是否执行成功,都会执行command2。
使用&&时,只有command1执行成功后,command2才会执行,否则command2不执行。
使用||时,command1执行成功后则command2不执行,否则执行command2,即command1和command2中
总有一条命令会执行。
# rm -rf test+
# touch test1 test3
# ls test2 && touch test2
ls:无法访问test2:没有那个文件或日录
# ls test2
ls:无法访问test2:没有那个文件或目录
只有当ls test2成功执行后,才会执行touch test2。因为test2不存在,ls test2没有损
行成功,所以&&后面的touch test2并没有执行。
ls test2 || touch test2
ls test*
若ls test2执行不成功,则会执行touch test2。