Shell设计(二)
时间:2006-12-20 来源:h0000001
常用的压缩指令
常见的压缩文件后缀(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稍微不同
卷标与运算符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稍微不同
相关阅读 更多 +