shell设计

来源:互联网 发布:cms监控客户端 编辑:程序博客网 时间:2024/06/10 23:37
 
常用的压缩指令
常见的压缩文件后缀(Linux文件的属性与文件名没有关系,以下所说只是习惯)
*.Z        compress程序压缩的文件
*.bz2      bzip2程序压缩的文件
*.gz       gzip程序压缩的文件
*.tar      tar程序打包的数据,没有经过压缩
*.tar,gz   tar程序打包的文件,且经过gzip压缩
 
 
compress   
语法:   #compress [-d] file_name
-d 解压缩参数!或使用uncompress也可以解压缩文件,基压缩后缀是*.Z
 
 
bzip2,bzcat
语法:   #bzip2 [-dz] file_name      <==压缩解压缩指令
       #bzcat file_name.bz2        <==读取压缩文件内容
-d:   解压缩,或使用bunzip2也可以解压缩文件.
-z:   压缩
 
 
gzip,zcat
语法:   #gzip [-d#] file_name    <==压缩与解压缩
       #zcat filename_gz        <==查看压缩文件内容
-d:   解压缩参数,或使用gunzip也可以解压缩文件.
-#:   压缩等级,1最不好,9最好,默认为6
 
 
tar
语法:   #tar [-zxcvfpP] file_name
        #tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source
参数说明:
-z:  是否同时具有gzip
-x:  解开一个压缩文件
-c:  建立一个压缩文件
-v:  压缩过程中显示文件
-f:  使用文件名
-p:  使用原文件的原有属性(属性不会依据用户而变)
-P:  可以使用绝对路径
-t:  查看tarfile里面的文件
-N:  比后面接的日期(yyyy/mm/dd)还要新的文件才会被打包进新建的文件中
--exclued FILE:  在压缩过程中,不要将FILE打包.
example:
#tar -cvf directory.tar directory
#tar -zcvf directory.tar directory
#tar -zcvf filename.tar.gz /home/test/*
#tar -xvf directory.tar
#tar -zxvf directory.tar.gz
#tar -ztvf directory.tar.gz
#tar -N '2006/112/21' -zcvf home.tar.gz /home
#tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc
#tar /dev/st0 /home
 
 
cpio
语法:  #cpio -cobB > [file|device]   <==备份
       #cpio -icduv < [file|device]  <==还原
-o:  将数据复制输出到文件或设备上
-i:  将数据自文件或设备复制输出到系统中
-t:  查看cpio建立的文件或设备的内容
-c:  以一种较新的便携式格式储存
-v:  让存储过程中文件名称可以在屏幕上显示
-B:  让默认的Blocks可以增至5120bytes,默认是512bytes.这样一来,可以让大文件储存速度加快.
-d:  自动建立目录,由于cpio的内容可能不在同一个目录内,如此在反备份过程会有问题.加上-d后,就可以自动将需要的目录建立起来.
-u:  自动用较新的文件覆盖较旧的文件.
 
使用cpio时,cpio无法直接读取文件,而是需要每个文件或目录的路径连同文件名一起才可以被记录下来.因此,cpio最常跟find指令一起使用.
如:
#find / -print | cpio -covB > /dev/st0
#cpio -icduv < /dev/st0
#cpio -icduv < /dev/st0 > /tmp/content
 
 
 
正规表示法
grep  
语法:   #grep "word" filename
将filename文件是有word的那一行显示出来.
 
 
通配符           意义
========================================================
^               句首字符相符
$               句尾相同的字符
?               任何一个单一字符
*               随意几个任意字符
/               跳转字符,将特殊字符变成普通字符
[list]          列表中的字符
[range]         列表中范围内的字符
[^list]         反向选择,与[list]相反
[^range]        反向选择,与[range]相反
/{n/}           与前一个相同字连续n个
/{n,m/}         与前一个相同字连续n-m个
==========================================================
如:
#grep ^boot /etc/*    <==查找/etc目录下所有的文件,找出以boot为开头的行.
#grep [XYZ] /etc/*    <==查找/etc目录下所有的文件,找出含有XYZ三个字符中任何一个字符的那一行.
 
 
 
 
 
=================================================================
学习使用Shell Scripts
 
讲了一大堆变量,管线指令,都是为了给脚本做铺垫的.现在开始学习脚本了.
脚本,字面意思就是剧本的意思,就是将我们要执行的内容写成一个脚本,让系统依据这个脚本来执行我们想要的东西.
基本上,执行脚本时,bash据以判断执行的步骤为:
1.如果读取到一个Enter符号(CR),就尝试开始执行该行命令
2.指令间的多个空白会被忽略,当一个空格来处理
3.空白行也将被忽略,并且Tab也不会被理会
4.如果一行内容太多,则可以使用/延伸至下一行
5.此外,使用最多的#可做为注释.任何加在#后面的字,将全部视为注释文字而被忽略.
 
在撰写脚本时,最好养成如下良好习惯
1.先宣告使用的shell为何(在某些情况下,如果没有宣告使用的shell,常会出现错误信息而导致脚本无法被执行.例如:/etc/crontab)
2.注明该脚本的内容功能,版本信息,作者,文件创建日期等
3.每一个大步骤的主要功能也要说明
 
 
执行一个脚本有两种方法.
1.将文件属性改成可以执行的属性.如chmod 755 script.sh.然后执行该文件.
2.另一种则是直接以sh这个可执行文件来执行脚本内容.如sh script.sh
 
卷标与运算符declare
语法:  #declare[-afirx]
参数说明:
-a:  定义为数组array
-f:  定义为函数function
-i:  定义为整数integer
-r:  定义为只读
-x:  定义为通过环境输出变量
来看一个例子.
[root@mail root]# a=5
[root@mail root]# b=7
[root@mail root]# c=$a*$b
[root@mail root]# echo $c
5*7
[root@mail root]# declare -i a=5
[root@mail root]# declare -i b=7
[root@mail root]# declare -i c=$a*$b
[root@mail root]# echo $c
35
[root@mail root]#
可以看到,如果不先声明变量类型,则该变量默认呈现字符串的形式.
 
 
交互式脚本:即程序会依据你的输入的数据进行判断.最简单的交互式指令是read指令,read的功能是将你在键盘上输入的内容放到变量中.如:
[root@mail root]# read name
h0000001
[root@mail root]# echo $name
h0000001
[root@mail root]#
 
定义一个脚本的参数代号
#myscript opt1 opt2 opt3 opt4
  $0       $1    $2  $3   $4
说明如下:
$0:myscript,即脚本的文件名
$1:opt1,即第一个附加的参数
$2:opt2,第二个附加的参数
$3:opt3,第三个附加的参数
 
 
 
 
脚本逻辑判断式与表达式
-----------------------------------------------------------------------------------
逻辑卷标        含义
-----------------------------------------------------------------------------------
1.             关于文件与目录的逻辑卷标
-f             常用!检测文件是否存在
-d             常用!检测目录是否存在
-b             检测是否为一个block文件
-c             检测是否为一个character文件
-S             检测是否为一个socket标签文件
-L             检测是否为一个符号链接文件
-e             常用!检测某个东西是否存在,可以是任何东西
2.             关于程序的逻辑卷标
-G             检测是否由GID所执行的程序拥有
-O             检测是否由UID所执行的程序拥有
-p             检测是否为程序间传送信息的name pipe或FIFO
3.             关于文件的属性检测
-r             检测是否为可读属性
-w             检测是否为可写入属性
-x             检测是否为可执行属性
-s             检测是否为非空白文件
-u             检测是否具有SUID属性
-g             检测是否具有SGID属性
-k             检测是否具有sticky bit属性
4.             两个文件之间的判断与比较
-nt            第一个文件比第二个文件新
-ot            第一个文件比第二个文件旧
-ef            第一个文件与第二个文件为同一个文件(诸如链接文件)
5.             逻辑与(and)和或(or)
&&             逻辑与
||             逻辑或
 
 
 
bash shell scripts的运算符的加减乘除运算
-----------------------------------------------------------------------------------
运算符          含义
-----------------------------------------------------------------------------------
=              等于
!=             不等于
<              小于
>              大于
-eq            等于
-ne            不等于
-lt            小于
-gt            大于
-le            小于或等于
-ge            大于或等于
-a             双方都成立(and)
-o             单方成立(or)
-z             空字符串
-n             非空字符串
     
 
条件判断语句if...then...fi
语法:
if [条件判断一] && (||( [条件判断二]; then 
...
elif [条件判断三] && (||) [条件判断四]; then
...
else
fi
需要注意的地方:
1.在[]中,只能有一个判断式;
2.在[]与[]间,可以使用&&或||结合判断;
3.每一个独立的组件之间需要用空格键隔开.
 
 
选择语句case...esac
语法:
case 种类方法(string) in
    
     种类方法一)
         程序执行段
         ;;
     种类方法二)
         程序执行段
         ;;
     *)
         echo "Usage: {种类方法一|种类方法二}"
         exit 1
esac
种类方式(string)格式方要有两种:
1.直接输入:就是以"执行文件+string"的方式执行.string可以直接写成$1.
2.交互式:就是由屏幕输出可能的项,然后让用户输入,通常必须配合read variable,然后string写成$variable的格式.
 
 
循环语名
.for((条件1;条件2;条件3))
.for variable in variable1 variable2 ......
.while [condition1] && {||} [condition2]...
.until [condition1] && {||} [condition2]...
 
while与until的分别是:
.until:直到条件符合的时候才能退出程序;
.while:当条件符合时,就继续做.
 
 
 
如何调试脚本
#sh [-nvx] scripts
-n:  不执行脚本,查询脚本内的语法,若有错误则列出
-v:  在执行脚本前,先将脚本的内容显示在屏幕上
-x:  将用到的脚本内容显示在屏幕上,与-v稍微不同
原创粉丝点击