Shell脚本基础知识

关于脚本

脚本是解释性语言,脚本内容需要解释器解释,不需要编译可以直接用,但运行效率低,用于记录系统命令,是以文本形式存在的
C和JAVA等是描述性语言,是将动作描述给系统,运行效率高

shell脚本

名称:
通常以.sh 结尾
基本内容:
Author:开发者
Version:版本
Mail:邮箱
Date:时间
Description: 描述
除了以上基础内容,文件还必须以 #!/bin/bash 开始 ,其中 #!告诉系统后面的参数是用来执行文件的,/bin/bash执行文件,#!/bin/bash 是幻数,在脚本运行时先运行bash程序
当需要写注释时,以#开头
执行方法:
1、chmod +x filename.sh 加可执行权限
./filename.sh 执行脚本 或者 使用绝对路径执行脚本
2、sh xx.sh 直接执行脚本文件
shell脚本的常见编译器:bash、sh。

实验:

[root@node1 ~]# cd /mnt
[root@node1 mnt]# vim ip_show.sh

文件内容如下:
这里写图片描述
执行该脚本:
这里写图片描述

给脚本自动添加前面的脚本解释内容

[root@node1 Desktop]# vim /etc/vimrc

这里写图片描述
注意:这里F4也可以换成其他的键,只要这个按键没有其他快捷作用时。
函数设定:
func 函数名( )
内容
endfunc

[root@node1 Desktop]# vim file.sh  #当是map...时按F4文件会出现以下内容,当是autocmd时打开第一次文件就可以看到以下内容

这里写图片描述

shell 基础命令

1、diff

diff file1 file2 比较文件file1和file2的不同
a 表示添加
c 表示改变
d 表示删除
1 a|c|d 1 前面的1表示第一个文件内容第一行,后面的1表示第二个文件的第1行
这里写图片描述
这里写图片描述
这里写图片描述
关于目录的打补丁(-r表示对目录进行补丁):
这里写图片描述

2、patch

[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# cat haha2
hello
haha
[root@node1 mnt]# diff haha2 haha1
2d1
< haha
[root@node1 mnt]# diff -u haha2 haha1  #显示补丁过程
--- haha2   2018-06-13 10:20:52.750946910 -0400
+++ haha1   2018-06-13 10:21:51.844946910 -0400
@@ -1,2 +1 @@
 hello
-haha
[root@node1 mnt]# diff -u haha2 haha1 > haha.path  #将补丁过程导入.path文件
[root@node1 mnt]# cat haha.path  #查看文件内容
--- haha2   2018-06-13 10:20:52.750946910 -0400
+++ haha1   2018-06-13 10:21:51.844946910 -0400
@@ -1,2 +1 @@
 hello
-haha
[root@node1 mnt]# yum install patch -y   #下载补丁工具,patch --help 可以查看相关命令及使用规则
[root@node1 mnt]# ls
file.sh  haha1  haha2  haha.path  ip_show.sh
[root@node1 mnt]# patch haha2 haha.path  #对文件进行补丁
patching file haha2
[root@node1 mnt]# cat haha2
hello
[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# vim haha2  #修改文件内容,为了重新生成补丁
[root@node1 mnt]# cat haha2
hello
123
[root@node1 mnt]# diff -u haha2 haha1 > haha.path   ##将补丁过程导入.path文件
[root@node1 mnt]# patch -b haha2 haha.path  #-b保留原文件,并进行补丁
patching file haha2
[root@node1 mnt]# ls  #查看有生成的原文件
file.sh  haha1  haha2  haha2.orig  haha.path  ip_show.sh
[root@node1 mnt]# cat haha1
hello
[root@node1 mnt]# cat haha2
hello

3、cut

-d 匹配符号
-f 1-3 显示1-3列
-c 1-3 显示第一到三的字符

[root@node1 mnt]# cp /etc/passwd .  #以便实验将passwd文件复制
[root@node1 mnt]# ls
file.sh  ip_show.sh  linux  passwd  unix
[root@node1 mnt]# vim passwd  #删除一部分内容
[root@node1 mnt]# cat passwd  #查看文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@node1 mnt]# cut -d : -f 1-2 passwd  #匹配符号 :并显示1、2列
root:x
bin:x
daemon:x
adm:x
lp:x
sync:x
[root@node1 mnt]# cut -d : -f 1,3 passwd  #匹配符号 : 并显示1,3列
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
[root@node1 mnt]# cut -c 1-5 passwd  #显示第1-5个字符
root:
bin:x
daemo
adm:x
lp:x:
sync:

脚本实验:执行脚本文件只显示ip
这里写图片描述
文件内容如下,共有三种:
1、此文件内容不够严谨,当ip不在第二行时就显示不出
这里写图片描述
2、优化后文件,grep查看含有inet的内容,查看含有inet那行第10列就是ip
这里写图片描述
3、再次优化,利用awk报告生成器
这里写图片描述

4、&&和| |

&& 表示true,在条件成立时使用
| | 表示false,在条件不成立时使用

[root@node1 mnt]# ping -c1 -w1 172.25.254.69 &> /dev/null && echo this ip up || echo this is down  
#c代表次数,w代表等待时间
this ip up

脚本实验:

[root@node1 mnt]# vim check_ip.sh

这里写图片描述

[root@node1 mnt]# sh check_ip.sh 172.25.254.69
172.25.154.69 is up

5、sort

多用于字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复的数字
sort -o 输出到指定文件
sort -t 指定分隔符
sort -k 指定要排序的列

[root@node1 mnt]# vim number
[root@node1 mnt]# cat number
1
3
5
9
33
2
54
3
4
[root@node1 mnt]# sort -n number  #纯数字排序
1
2
3
3
4
5
9
33
54
[root@node1 mnt]# sort -rn number  #倒序
54
33
9
5
4
3
3
2
1
[root@node1 mnt]# sort -rn -u number  #去掉重复的数字并倒序
54
33
9
5
4
3
2
1
[root@node1 mnt]# sort -rn number -o file  #将倒序数字输出到文件file
[root@node1 mnt]# cat file  #查看导入内容
54
33
9
5
4
3
3
2
1
[root@node1 mnt]# vim file  #修改file内容
[root@node1 mnt]# cat file  #查看修改后内容
2:54 
4:33
3:9
2:5
4:4
5:3
7:3
:2
:1
[root@node1 mnt]# sort -t : -k 1 file  #指定分隔符:对第二列排序
:1
:2
2:5
2:54
3:9
4:33
4:4
5:3
7:3

6、uniq

对重复字符作相应的处理
uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数

[root@node1 mnt]# vim file  #编写文件内容
[root@node1 mnt]# cat file  #对文件内容进行查看
2:54
4:33
3:9
4:4
4:4
5:3
5:3
:2
:1
[root@node1 mnt]# uniq -u file  #显示文件唯一的行
2:54
4:33
3:9
:2
:1
[root@node1 mnt]# uniq -d file  #显示文件重复的行
4:4
5:3
[root@node1 mnt]# uniq -c file  #文件内容每行显示一次并统计重复次数
      1 2:54
      1 4:33
      1 3:9
      2 4:4
      2 5:3
      1 :2
      1 :1

7、test

和[ ]等同
test “$A” == “$B” 等同 [ “$A” == “$B” ]
[ “$A” = “$B” ]
[ “$A” != “$B” ]
[ “$A” -eq “$B” ] 等于
[ “$A” -ne “$B” ] 不等于
[ “$A” -le “$B” ] 小于等于
[ “$A” -lt “$B” ] 小于
[ “$A” -ge “$B” ] 大于等于
[ “$A” -gt “$B” ] 大于
[ “$A” -ne “$B” -a “$A” -gt “$B” ] ne表示不等于,a表示and都满足
[ “$A” -ne “$B” -o “$A” -gt “$B” ] o表示or至少满足一个
[ -z “$A” ] 表示值为空
[ -n “$A” ] 表示值不为空
[ “file1” -ef “file2” ] ef 表示文件是否为硬连接
[ “file1” -nt “file2” ] 表示new,file1是否比file2文件新
[ “file1” -ot “file2” ] 表示old,file1是否比file2文件老
注意:在编写文档时注意[ ]里面的内容前后要有空格,“”必须是英文的,不然在执行脚本时会报错。

[root@node1 mnt]# a=1
[root@node1 mnt]# b=2
[root@node1 mnt]# test "$a" == "$b" && echo yes || echo no #判断a和b是否相等
no  
[root@node1 mnt]# [ "$a" == "$b" ] && echo yes || echo no
no
[root@node1 mnt]# ls
check_ip.sh  file  file.sh  ip_show.sh  linux  number  passwd  unix
[root@node1 mnt]# ln /mnt/file /mnt/file1  #创建硬连接
[root@node1 mnt]# ls -li *  #查看连接
11759340 -rw-r--r-- 1 root root 363 Jun 13 10:49 check_ip.sh
11759361 -rw-r--r-- 2 root root  36 Jun 13 10:56 file
11759361 -rw-r--r-- 2 root root  36 Jun 13 10:56 file1
11759332 -rw-r--r-- 1 root root   2 Jun 13 10:06 file.sh
11759341 -rwxr-xr-x 1 root root  60 Jun 13 10:39 ip_show.sh
11759348 -rw-r--r-- 1 root root  20 Jun 13 10:52 number
11759343 -rw-r--r-- 1 root root 215 Jun 13 10:41 passwd

linux:
total 0
33572969 -rw-r--r-- 1 root root 0 Jun 13 10:30 haha

unix:
total 0
[root@node1 mnt]# [ "/mnt/file" -ef "/mnt/file1" ] && echo yes || echo no  
#判断文件是否为硬链接
yes
[root@node1 mnt]# [ "/mnt/file" -ef "/mnt/number" ] && echo yes || echo no  
no 
[root@node1 mnt]# [ "/mnt/file" -ot "/mnt/number" ] && echo yes || echo no  
#判断file是否比number文件老
no
[root@node1 mnt]# [ "/mnt/file" -nt "/mnt/number" ] && echo yes || echo no  
#判断file是否比number文件新
yes

脚本实验:输入一个数与10比较大小

[root@node1 mnt]# vim num_check.sh

这里写图片描述
测试:
这里写图片描述

8、test测试文件类型

-e 表示存在
-f 普通文件
-L 软连接,在脚本文件中写判断文件类型时,将软连接判断写在普通文件判断前面,因为软连接也是一种文本文件
-S 套接字
-b 块设备
-d 目录
-c 字符设备

[root@node1 mnt]# vim file.sh

文件内容如下:
这里写图片描述

[root@node1 mnt]# ls
file.sh
[root@node1 mnt]# sh file.sh -e  #判断file是否存在
no
[root@node1 mnt]# touch file
[root@node1 mnt]# sh file.sh -e
yes
[root@node1 mnt]# sh file.sh -f  #判断file是否为普通文件
yes
[root@node1 mnt]# sh file.sh -L  #判断file是否为软连接
no
[root@node1 mnt]# ln -s /mnt/file.sh file  #创建软连接
[root@node1 mnt]# sh file.sh -L 
yes
[root@node1 mnt]# sh file.sh -S  #判断file是否为套接字
no
[root@node1 mnt]# yum install mariadb-server -y  #下载mariadb服务软件
[root@node1 mnt]# rsync -D /var/lib/mysql/mysql.sock /mnt/file  #复制mysql套接字文件到file
[root@node1 mnt]# sh file.sh -S
yes
[root@node1 mnt]# sh file.sh -b  #判断file是否为块设备
no
[root@node1 mnt]# rsync -D /dev/vdb /mnt/file  #将设备vdb复制到文件file
[root@node1 mnt]# sh file.sh -b
yes
[root@node1 mnt]# sh file.sh -d  #判断file是否是目录
no
[root@node1 mnt]# rm -f file   #删除file
[root@node1 mnt]# mkdir file  #创建目录file
[root@node1 mnt]# sh file.sh -d
yes
[root@node1 mnt]# sh file.sh -c  #判断file是否为字符设备
no
[root@node1 mnt]# rsync -D /dev/pts/ /mnt/file  #输入键放在/dev/pts后按Tab查看字符设备 
0     ptmx  
[root@node1 mnt]# rsync -D /dev/pts/0 /mnt/file  #将字符设备同步到file
[root@node1 mnt]# sh file.sh -c
yes

9、tr

tr 转换字符大小
格式:tr 参数1 参数2 标准输入

[root@node1 mnt]# vim file
[root@node1 mnt]# cat file
abc 
def
[root@node1 mnt]# tr 'a-z' 'A-Z' < file  #将文件小写字符转换为大写
ABC 
DEF
[root@node1 mnt]# tr 'A-Z' 'a-z' < file   #将文件大写字符转换为小写
abc 
def

脚本实验:
判断执行脚本时输入的内容和hello是否相等

[root@node1 mnt]# vim haha.sh

这里写图片描述
这里写图片描述
出现上面的情况是因为执行判断时不能自动转换字母的大小写,以致输入大写时会出现不相等的情况,这时就需要 tr 命令对输入的内容进行转义

[root@node1 mnt]# vim haha.sh

修改后文件内容为:
这里写图片描述
然后进行判断大小写都可以:
这里写图片描述

10、shell 脚本排错

[root@node1 mnt]# vim haha.sh

文件内容如下(将命令ifconfig写错):
这里写图片描述
执行文件会进行报错但是不知道具体时间那个命令写错了,这时加 -x 参数观察运行情况,会对具体命令以及行数进行报错。
这里写图片描述
查看脚本内容的具体错误提示,根据提示进行相应修改即可

脚本建立用户

步骤:
1、查看脚本后所跟字符是不是两串
2、查看用户是否存在,如果不存在
3、建立不存在的用户并设定密码

[root@node1 mnt]# vim user_create.sh

文件内容如下:
这里写图片描述
测试执行脚本时后面不跟字符,以及跟字符建立用户,和再次建立用户:
这里写图片描述

shell脚本基础知识(一)

05-22

rn[align=center]shell脚本基础知识[/align]rnrn日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富。笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要不断的练习,只要你shell脚本写的好,相信你的linux求职路就会轻松的多。笔者在这一章中并不会多么详细的介绍shell脚本,而只是带你进入shell脚本的世界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。rnrn在学习shell 脚本之前,需要你了解很多关于shell的知识,这些知识是编写shell脚本的基础,所以希望你能够熟练的掌握。rnrn【什么是shell】rnrn简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。rnrn笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢?rnrn1)记录命令历史rnrn我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。rnrn与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745980_792428.png][/img]rnrn2)指令和文件名补全rnrn在本教程最开始笔者就介绍过这个功能了,记得吗?对了就是按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名。连续按两次tab键,系统则会把所有的指令或者文件名都列出来。rnrn3)别名rnrn前面也出现过alias的介绍,这个就是bash所特有的功能之一了。我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。如果不想用了,还可以用unalias解除别名功能。直接敲alias会看到目前系统预设的alias :rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746000_901725.png][/img]rnrn看到了吧,系统预设的alias指令也就这几个而已,你也可以自定义你想要的指令别名。alias语法很简单,alias [命令别名]=[’具体的命令’]。rnrn4)通配符rnrn在bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746014_391608.png][/img]rnrn5)输入输出从定向rnrn输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>,稍后会详细介绍。rnrn6)管道符rnrn前面已经提过过管道符”|”,就是把前面的命令运行的结果丢给后面的命令。rnrn7)作业控制。rnrn当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)。rnrn【变量】rnrn前面章节中笔者曾经介绍过环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的。变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可。你可以使用echo命令显示变量的值。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746028_386961.png][/img]rnrn除了PATH, HOME, LOGNAME外,系统预设的环境变量还有哪些呢?rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746080_895015.png][/img]rn使用env命令即可全部列出系统预设的全部系统变量了。不过登录的用户不一样这些环境变量的值也不一样。当前显示的就是root这个账户的环境变量了。下面笔者简单介绍一下常见的环境变量:rnrnPATH 决定了shell将到哪些目录中寻找命令或程序rnrnHOME 当前用户主目录rnrnHISTSIZE 历史记录数rnrnLOGNAME 当前用户的登录名rnrnHOSTNAME 指主机的名称rnrnSHELL 前用户Shell类型rnrnLANG 语言相关的环境变量,多语言可以修改此环境变量rnrnMAIL 当前用户的邮件存放目录rnrnPWD 当前目录rnrnenv命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746133_553325.png][/img]rnrn限于篇幅,笔者在上例中并没有把所有显示结果都截图。set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。用户自定义变量?是的,用户自己同样可以定义变量。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746146_301289.png][/img]rnrn虽然你可以自定义变量,但是该变量只能在当前shell中生效,不信你再登录一个shell试试?rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746165_558690.png][/img]rnrn使用bash命令即可再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shell,myname变量还在。那要想设置的变量一直生效怎么办?有两种情况:rnrn1) 要想系统内所有用户登录后都能使用该变量rnrn需要在/etc/profile文件最末行加入 “export myname=Aming” 然后运行”source /etc/profile”就可以生效了。此时你再运行bash命令或者直接su - test账户看看。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746195_54436.png][/img]rnrn2)只想让当前用户使用该变量rnrn需要在用户主目录下的.bashrc文件最后一行加入“export myname=Aming” 然后运行”source .bashrc”就可以生效了。这时候再登录test账户,myname变量则不会生效了。上面用的source命令的作用是,讲目前设定的配置刷新,即不用注销再登录也能生效。rnrn笔者在上例中使用”myname=Aming”来设置变量myname,那么在linux下设置自定义变量有哪些规则呢?rnrna. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;rnrnb. 变量名只能由英、数字以及下划线组成,而且不能以数字开头;rnrnc. 当变量内容带有特殊字符(如空格)时,需要加上单引号;rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746215_647644.png][/img]rnrn有一种情况,需要你注意,就是变量内容中本身带有单引号,这就需要用到双引号了。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746228_944822.png][/img]rnrnd. 如果变量内容中需要用到其他命令运行结果则可以使用反引号;rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746245_827224.png][/img]rnrne. 变量内容可以累加其他变量的内容,需要加双引号;rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746257_579162.png][/img]rnrn在这里如果你不小心把双引号加错为单引号,将得不到你想要的结果rn[img=http://img.bbs.csdn.net/upload/201405/22/1400746271_794303.png][/img]rnrn通过上面几个例子也许你能看得出,单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。rnrn在前面的例子中笔者多次使用了bash命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746284_462154.png][/img]rnrnpstree这个指令会把linux系统中所有进程通过树形结构打印出来。限于篇幅笔者没有全部列出,你可以直接输入pstree查看即可。在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令,笔者曾经在前面用过。rn[img=http://img.bbs.csdn.net/upload/201405/22/1400746712_855928.png][/img]rnrnexport其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746778_434120.png][/img]rnrn在最后面连同我们自定义的变量都被声明了。rnrn前面光讲如何设置变量,如果想取消某个变量怎么办?只要输入”unset 变量名”即可。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746788_608282.png][/img]rnrn用unset abc后,再echo $abc则不再输出任何内容。rnrn【系统环境变量与个人环境变量的配置文件】rnrn上面讲了很多系统的变量,那么在linux系统中,这些变量被存到了哪里呢,为什么用户一登陆shell就自动有了这些变量呢?rnrn/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等。rnrn/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746801_575988.png][/img]rnrn\u就是用户,\h 主机名, \W 则是当前目录,\$就是那个’#’了,如果是普通用户则显示为’$’rnrn除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:rnrn.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。rnrn.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。rnrn.bash_history :记录命令历史用的。rnrn.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。rnrn rnrnrn rn

shell脚本基础知识(二)

05-22

【linux shell中的特殊符号】rnrn你在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字。下面笔者就说一说常用到的特殊字符。rnrn1. * :代表零个或多个字符或数字。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746821_201693.png][/img]rnrntest后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来。rnrn2. ? :只代表一个任意的字符rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746830_769343.png][/img]rnrn不管是数字还是字母,只要是一个都能匹配出来。rnrn3. # :这个符号在linux中表示注释说明的意思,即”#”后面的内容linux忽略掉。rn[img=http://img.bbs.csdn.net/upload/201405/22/1400746880_476338.png][/img]rnrn在命令的开头或者中间插入”#” ,linux都会忽略掉的。这个符号在shell脚本中用的很多。rnrn4. \ :脱意字符,将后面的特殊符号(例如”*” )还原为普通字符。rn[img=http://img.bbs.csdn.net/upload/201405/22/1400746892_615205.png][/img]rnrn5. | :管道符,前面多次说过,它的作用在于将符号前面命令的结果丢给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍。rnrn6. $ :除了用于变量前面的标识符外,还有一个妙用,就是和’!’结合起来使用。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746905_715802.png][/img]rnrn‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上条命令中最后出现的那个东西)例如上边命令最后是test.txt那么在当前命令下输入!$则代表test.txt。rnrn1)grep :过滤一个或多个字符,将会在后续内容中详细介绍其用法。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746972_811377.png][/img]rnrn2) cut :截取某一个字段rnrn语法:cut -d “分隔字符” [-cf] n 这里的n是数字rnrn-d :后面跟分隔字符,分隔字符要用双引号括起来rnrn-c :后面接的是第几个字符rnrn-f :后面接的是第几个区块rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400746988_884196.png][/img]rnrn-d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f和1之间的空格可有可无。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747001_462877.png][/img]rnrn-c 后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747012_526803.png][/img]rnrn3) sort :用做排序rnrn语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2rnrn-t 分隔符 :作用跟cut的-d一个意思rnrn-n :使用纯数字排序rnrn-r :反向排序rnrn-u :去重复rnrn-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747023_118169.png][/img]rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747035_562159.png][/img]rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747059_273248.png][/img]rnrn4) wc :统计文档的行数、字符数、词数,常用的选项为:rnrn-l :统计行数rnrn-m :统计字符数rnrn-w :统计词数rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747070_317733.png][/img]rnrn5) uniq :去重复的行,笔者常用的选项只有一个:rnrn-c :统计重复的行数,并把行数写在前面rn[img=http://img.bbs.csdn.net/upload/201405/22/1400747084_715306.png][/img]rnrn有一点需要注意,在进行uniq之前,需要先用sort排序然后才能uniq,否则你将得不到你想要的,笔者上面的试验当中已经是排序过所以省略掉那步了。rnrn6)tee :后跟文件名,类似与重定向”>”,但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747099_41749.png][/img]rnrn7)tr :替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号。常用的选项有两个:rnrn-d :删除某个字符,-d 后面跟要删除的字符rnrn-s :把重复的字符去掉rnrn最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747111_981144.png][/img]rnrn当然替换一个字符也是完全可以的。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747123_19341.png][/img]rnrn不过替换、删除以及去重复都是针对一个字符来讲的,有一定局限性。如果是针对一个字符串就不再管用了,所以笔者建议只是简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747133_891065.png][/img]rnrn8)split :切割文档,常用选项:rnrn-b :依据大小来分割文档,单位为bytern[img=http://img.bbs.csdn.net/upload/201405/22/1400747147_601507.png][/img]rnrn格式如上例,后面的passwd为分割后文件名的前缀,分割后的文件名为passwdaa, passwdab, passwdac …rnrn-l :依据行数来分割文档rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747156_595464.png][/img]rnrn6. ; :分号。平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”了。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747167_208513.png][/img]rnrn7. ~ :用户的家目录,如果是root则是 /root ,普通用户则是 /home/usernamernrn[img=http://img.bbs.csdn.net/upload/201405/22/1400747179_682873.png][/img]rnrn8. & :如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745955_871541.png][/img]rnrn使用jobs可以查看当前shell中后台执行的任务。用fg可以调到前台执行。这里的sleep命令就是休眠的意思,后面跟数字,单位为秒,常用语循环的shell脚本中。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745938_357542.png][/img]rnrn此时你按一下CTRL +z 使之暂停,然后再输入bg可以再次进入后台执行。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745918_350452.png][/img]rnrn如果是多任务情况下,想要把任务调到前台执行的话,fg后面跟任务号,任务号可以使用jobs命令得到。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745888_398356.png][/img]rnrn9. >, >>, 2>, 2>> :前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745842_736508.png][/img]rnrn10. [ ] :中括号,中间为字符组合,代表中间字符中的任意一个rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745823_495212.png][/img]rnrn11. && 与 ||rnrn在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&”和”||”。下面笔者把这几种情况全列出:rnrn1) command1 ; command2rnrn2) command1 && command2rnrn3) command1 || command2rnrn使用”;”时,不管command1是否执行成功都会执行command2; 使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。rnrn[img=http://img.bbs.csdn.net/upload/201405/22/1400745783_508578.png][/img]rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭