存档

文章标签 ‘shell’

常有shell脚本

2011年4月7日 1 条评论

转载:http://hdxiong.iteye.com/blog/949063

1、脚本之间传递参数 “1.sh”的脚本,接受参数。

如下,如果有一个参数则赋值个sourceFile这个变量,否则用默认值。

#!/bin/bash
LANG=en_US.UTF-8
#get parameters
sourceFile=”/data/log/abc”
if [ $# == 1 ]
then sourceFile=$1
else echo “$1 required!”
fi
echo $sourceFile

备注:这里$#是传递参数的个数,$1 是具体的参数。

关于if else:
如果两条命令写在同一行则需要用”;”号隔开,一行只写一条命令就不需要写”;”号了。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束。

“2.sh”的脚本,传递参数

#!/bin/bash
sh 1.sh 参数1 参数2 …

备注:多个参数之间用空格符隔开。

2、文件内容行之间的排序

#!/bin/bash
sort -t= +4 文件 ”

备注:“=”表示按=号进行切割,“+4”表示按第五个项进行排序。

3、判断目录是否存在,没有则新建一个目录

#!/bin/bash
dayDir=”/home/logs/”
if [ ! -d “$dayDir” ]
then mkdir “$dayDir” fi

4、判断文件是否存在,有则删除

#!/bin/bash
if [ -f “$FAIL_FILE” ]
then
rm -rf “$FAIL_FILE”
echo date” FILE IS EXISTS: “$FAIL_FILE
fi

5、找出文件中的相关行

#!/bin/bash
cat 文件 |grep -a “关键词” >> result.log

备注:把文件中包含关键词的行输出到result.log中。

6、文件切分

#!/bin/bash
awk -F” ‘{print $1}’ 文件

备注:“”表示分隔符,“print”表示换行输出(printf不换行),“$1”表示取第一项。“文件”表示要切分的文件

7、文件内容排重

#!/bin/bash
awk -F’,’ ‘!a[$1]++’ test.txt

备注:“,”表示按“,”号分隔;“$1”表示按第一项排重;“test.txt”表示要处理的文件。

8、grep多个关键字

#!/bin/bash
cat $file |grep -a “aop=keyword1\|keyword2”

备注:多个关键字用“\|”分隔。

9、时间格式化,中间有空格的需要加引号

#!/bin/bash
TODAY=date -d today '+%Y-%m-%d %H:%M:%S'

10、多个文件合并

#!/bin/bash
cat $FILE1 $FILE2 |grep -a “关键字” > $MERGE_FILE

11、运行java项目

#!/bin/bash
LANG=en_US.UTF-8
export LANG=$LANG
/usr/java/latest/bin/java -cp . -Djava.ext.dirs=../lib 包.类(含main方法) -a 参数1 -b 参数2

备注:“/usr/java/latest/bin/java”表示Java环境,“-cp”表示classpath路径,“.”表示当前目录,“-Djava.ext.dirs”表示jar文件所在目录,“-a”表示参数名称,“参数1”表示参数值。

12、根据关键字统计行数,赋值给变量

#!/bin/bash
COUNT=$(cat $FILE |grep -a “关键字” |wc -l)

备注:“$FILE”表示要统计的文件,“关键字”要包含的关键字,“wc”统计文件(-l行数,-w字数,-c字节数)
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
语法:wc [选项] 文件…
说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。
该命令各选项含义如下:
-c 统计字节数。
-l 统计行数。
-w 统计字数。
这些选项可以组合使用。 输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。 行数、字数、字节数、文件名 如果命令行中没有文件名,则输出中不出现文件名。 例如: $wc -lcw file1 file2 4 33 file1 7 52 file2 11 11 85 total 省略任选项-lcw,wc命令的执行结果与上面一样。

13、基本算术计算的方法(5种)

a.使用awk计算

#!/bin/bash
##示例1:10和12为两个参数分别对应$1和$2
echo 10 12 |awk ‘{printf(“%d\n”, $1+$2)}’

##示例2:a和b作为两个变量传入
a=10
b=12
echo |awk ‘{printf(“%d\n”, ‘$a’+’$b’)}’

##示例3:COUNT_FAIL除以COUNT_INIT 保留4为小数,结果赋值给FAIL_INIT,[b]结果四舍五入[/b]。
COUNT_FAIL=10
COUNT_INIT=20 FAIL_INIT=awk 'BEGIN{printf "%.4f\n",'$COUNT_FAIL'/'$COUNT_INIT'}'
echo $FAIL_INIT

备注:示例2和示例3两种写法除数和被除数都要加“’”号(单引号),否则会报错“division by zero attempted”,另外“BEGIN”也很重要哦。

b.使用bc命令

#!/bin/bash
##示例1:输出 1+2 的运算结果
echo 1+2 |bc

##示例2:COUNT_FAIL除以COUNT_INIT 保留2为小数,结果赋值给FAIL_INIT,[b]结果不四舍五入[/b]。
FAIL_INIT=echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc

c.使用expr命令

#!/bin/bash
count=10
count=expr $count + 12
echo $count

d.使用let命令

#!/bin/bash
##示例1
let num1=10*20
echo $num1

##示例2
let “num2=10*20”
echo $num2

e.加双括号

#!/bin/bash
##示例1:双小括号
a=12
b=20
echo $((a*b))
echo $(($a*$b))

##示例2:中括号
c=10
echo [c*20]
echo $[$c*20]

备注:此种写法括号里面的变量可以不用加“$”符号,但是括号外面的“$”符号一定要加上。

14、运用tee命令将日志同时输出到多个文件

tee用法功能说明:读取标准输入的数据,并将其内容输出成文件。
语 法:tee [-ai][–help][–version][文件…]
补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
参 数:
-a或–append 附加到既有文件的后面,而非覆盖它.
-i或–ignore-interrupts 忽略中断信号。
-help 在线帮助。
-version 显示版本信息。
例1:日志在记入log1.txt和log2.txt的同时也在控制台输出
Shell代码  收藏代码

#!/bin/bash
echo “hello jack!” |tee -a log1.txt log2.txt

备注:“-a”追加,否则清空重写。

15、针对某个域进行分组统计

#!/bin/bash
cat $FILE |awk -F”” ‘{list[$11]++;}END{for (val in list) print val, list[val];}’ |tee -a $RESULT_FILE

备注:“$FILE”要处理的文件,用awk命令按“”进行切分,“$11”表示第11域(1,3,5,…),“var”表示分组名称,“list[var]”表示每组的数量。

16、查询控制命令的历史记录

#!/bin/bash history |grep “rm”

备注:查询包含“rm”字符的命令记录。

17、循环删除所有文件

#!/bin/bash
for i in ls; do rm $i; done

备注:在文件非常多的情况下,rm * 命令不能删除所有文件。所以需要遍历删除每一个文件。

18、遍历文件夹并按第二个域对文件内容排序。

#!/bin/bash
#用等号分隔,按第二个域排序
function sortfile(){
echo ‘Processing: ‘$1 sort -t= +1 $1 > $1’_temp’
mv $1’_temp’ $1
}
#遍历文件夹,调用排序函数
function ergodic(){
for file in ls $1
do
if [ -d $1″/”$file ]
then
ergodic $1″/”$file
else
f=$1″/”$file
#调用排序函数
sortfile $f
fi
done
}
#以参数形式运行程序
if [ $# == 1 ];
then
echo “parameter: “$1;
ergodic $1
else
echo “a file directory required!”
fi

19、查看文件夹下所有文件数目和所有文件夹数目

#!/bin/bash #查看当前文件夹下所有文件数目 find . -type f |wc -l #查看当前文件夹下所有文件夹数目 find . -type d |wc -l

备注:“.”表示当前目录,可以换成其他路径。

20、shell与java正则区别

String regex = “2010-11-08.+” //或者 regex = “2010-11-08.*”

备注:JAVA中匹配以“2010-11-08″开头的字符串。

regex = “2010-11-08*”

备注:SHELL中匹配以“2010-11-08”开头的字符串。 “.*”或“.+”在java中表示任意多个字符串,如果要匹配“.”号,需要加转义“\”。 “*”在shell表示任意多个字符,加“.”或“+”号都会错误。

21、编码转换命令

iconv -f gb2312 -t utf-8 a.log > b.log

备注:表示把a.log文件从gb2312编码转成utf-8的编码,并把文件写入b.log

分类: linux 标签:

ip的正则表达式

2011年4月1日 没有评论

看了一些需要验证ip地址输入格式的,都不是很贴切,需要用的,用这个吧

/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/

参考其他

首先问大家一个问题:
php?name=%B1%E0%B3%CC%D3%EF%D1%D4″ onclick=”tagshow(event)”>编程语言(比如ruby)中什么数据类型最重要?可能大家会说到──对象,数组….
其实是String(字符串)
而对字符串的处理很大一部分依赖匹配,而匹配方法中,正则表达式是“降龙十八掌”,下面我们就学习正则表达式

首先是 元字符:
. :匹配除换行符以外的任意字符
[x]:匹配中括号中的任意一字符 如[abc]则匹配a或b或c
[^x] :匹配除了x以外的任意字符 :如[^abc] 则匹配除a/b/c以外的任意一字符
^ :匹配开始地方  如:^a 表示匹配以a开头的,^[a-z] 表示以小写任意一字母开头的
$ :匹配结束地方 如:a$ 表示匹配以a结尾的
x|y :匹配x或匹配y 如 ^[a-z] | ^[0-9] 表示以任意一小写字母开头,或以任意一数字开头的。实现上这个匹配也可以写成^[a-z0-9],不过|还是有它的独有的适用之处的

量词(限定符)
? :重复0次或1次
× :重复0次或多次
+ :重复1次或多次
{m} :重复m次
{m,} :重复m次或更多次
{m,n} :重复m次至n次

例如 “aa” “aaa” “aaaa” 正则表达式 /^a{2,3]$/ 能匹配第一个和第二个字符串,因为此表达式是说,从开头到结尾中间是连续2个至3个a都可以。
例:”d3df” “abcd” “3dfs4” “dfsde” ,正则表达式/^[a-z]*$/ 能匹配第二个和第四个,因为此表达式是说,从开头到结尾是0个或多个(不限制多少个)a-z之内的字符(即小写字母)但,对此例,用/[a-z]*/则能 匹配成功这四个字符串。如果换用 /[a-z]+$/则只能匹配成功除第3个字符串以外的三个字符串。为什么?此表达式是说以1个或多个连续的a-z之内(即小写字母)的字符结尾。
常用字符集
\s :所有空白字符
\S :所有非空白字符
\w :所有字母、数字、下划线、汉字的字符
\W :所有不是字母、数字、下划线、汉字的字符
\d :所有数字字符
\D :所有非数字字符
\b :单词的开始或结尾
\B :匹配不是单词或开始的位置
分组
上面我们例用 {} × +等可重复多个字符,如果想要重复一个字符串又该怎么办,你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了
例如,简单的匹配IP地址,(\d{1,3}\.){3}\d{1,3} 此表达式的意思是,前面小括号中是说匹配数字的1-3个和一个字符.,后面一个{3}表示重复3次,这3次是对前面整个小括号所匹配的内容(即是一个字符串)复复3次,再后面匹配一个1-3位的数字

后向引用
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本
例 \b(\w+)\s*\1 此表达式或匹配两个连续的单词,\b匹配单词开始位置,\w+是匹配任意的字符至少一个,小括号进行了第一个编组,\s*是匹配0个或多个空格,后面的 \1是引用了前面第一个编组匹配成功的字符串,如hello hello 对于此表达式,\b(\w+)是匹配了第一个hello ,则\1就是使用它的值–hello

(? =exp)也叫零宽先行断言或正预查,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如/b/w+(?=ing/b),匹配以 ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I’m singing while you’re dancing.时,它会匹配sing和 danc。

(?!exp)零宽负向先行断言,只会匹配后缀exp不存在的位置。/d{3}(?!/d)匹配三位数字,而且这三位数字的后面不能是数字。

当 正则表达式中包含能接受重复的限定符(指定数量的代码,例如*, {4,8}等)时,通常在使整个表达式能得到匹配的前提下匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b 结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配
在 * + {}后面加上? 表示以非贪婪法去匹配,再以上例,a.*?b去匹配aabab的话,则会匹配aab

下面是一些常用的正则表达式:

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?<\\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+:\/[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:简单匹配ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*;  //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

分类: shell 标签:

shell 编程技巧

2011年3月16日 没有评论

文件传输

1. 拷贝文件或目录至远程工作站
语法: rcp [-r] 源地址主机名:目的地址
源地址文件名、目录名或路径。
主机名工作站名。目的地址路径名称。
例如:
rcp file1 doc:/home/user 将文件f i l e 1拷贝到工作站doc 路径/home/user 下。
rcp -r dir1 doc:/home/user 将目录d i r 1拷贝到工作站doc 路径/home/user 下。
2. 自远程工作站,拷贝文件或目录
语法: rcp [-r] 主机名:源地址目的地址
主机名工作站名。
源地址路径名。
目的地址、文件名、目录名或路径。
例如:
rcp doc:/home/user/file1 file2 将工作站d o c路径/home/user 下的目录d i r 1,拷贝到当前工作站的目录下,目录名仍为d i r 1。
rcp -r doc:/home/user/dir1 . 将工作站doc 路径/home/user 下的目录d i r 1,拷贝到当前工作站的目录下,目录名仍为d i r 1。
3. 本地工作站与远程工作站之间的文件传输
必须拥有远程工作站的帐号及密码,才可进行传输工作。
语法: ftp 主机名或ftp ip地址
例如:
ftp doc 与远程工作站doc 之间进行文件传输。
Name (doc:user-name): <输入帐号>
Password (doc:user-password): <输入密码>
ftp> help 列出ftp 文件传输时可使用的命令。
ftp> !ls 列出本地工作站当前目录下的所有文件名。
ftp> !pwd 列出本地工作站当前所在的目录位置。
ftp> ls 列出远程工作站当前目录下的所有文件名。
ftp> dir 列出远程工作站当前目录下的所有文件名。
ftp> dir . |more 分页列出远程工作站当前目录下的所有文件名。
ftp> pwd 列出远程工作站当前所在的目录位置。
ftp> cd dir1 更改远程工作站的工作目录位置至dir1 之下。
ftp> get file1 将远程工作站的文件f i l e 1拷贝到本地工作站中。
ftp> put file2 将本地工作站的文件f i l e 2拷贝到远程工作站中。
ftp> mget *.c 将远程工作站中扩展文件名为c 的所有文件拷贝到本地工作站中。
ftp> mput *.txt 将本地工作站中扩展文件名为txt 的所有文件拷贝到远程工作站中。
ftp> prompt 切换交互式指令(使用mput/mget 时不是每个文件皆询问y e s / n o )。
ftp> quit 结束ftp 工作。
ftp> bye 结束ftp 工作。
注意从PC与工作站间的文件传输也可透过在PC端的FTP指令进行文件传输,指令用法与上述指令大致相同。
 
 

文件权限的设定

改变文件或目录的读、写、执行权限
语法:chmod [-R] mode name
name:文件名或目录名。
mode: 3个8位数字或rwx的组合。r-read (读),w-write (写),x-execute (执行),u-user (当前用户),g-group(组),o-other(其他用户)。
例如:
chmod 755 dir1 对于目录dir1,设定成任何使用者皆有读取及执行的权利,但只有所
有者可做修改。
chmod 700 file1 对于文件file1,设定只有所有者可以读、写和执行的权利。
chmod u+x file2 对于文件file2,增加当前用户可以执行的权利。
chmod g+x file3 对于文件file3,增加工作组使用者可执行的权利。
chmod o-r file4 对于文件file4,删除其他使用者可读取的权利。
改变文件或目录的所有权
语法:chown [-R] 用户名name
name:文件名或目录名。
例如:
chown user file1 将文件file1 改为用户user 所有。
chown -R user dir1 将目录dir1及其子目录下面的所有文件改为用户user 所有。

改变文件或目录工作组所有权
语法:chgrp [-R] 工作组名name
name:文件名或目录名
例如:
chgrp vlsi file1 将文件file1 的工作组所有权改为vlsi 工作组所有。
chgrp -R image dir1 将目录dir1及其子目录下面的所有文件,改为image 工作组所有。

进程控制

1.查看系统中的进程
语法:ps [-aux]
例如:
p s或ps -x 查看系统中,属于自己的进程。
ps -au 查看系统中,所有用户的进程。
ps -aux 查看系统中,包含系统内部的及所有用户的进程。
2. 结束或终止进程
语法:kill [-9] PID
PID:利用ps 命令所查出的进程号。
例如:
kill 456或kill -9 456 终止进程号为456 的进程。
3. 在后台执行进程的方式
语法:命令&
例如:
cc file1.c & 将编译file1.c 文件的工作置于后台执行。
语法:按下Control+Z键,暂停正在执行的进程。键入bg命令,将暂停的进程置于后台继
续执行。
例如:
cc file2.c
^ Z
Stopped
bg
4. 查看正在后台中执行的进程
语法:jobs
5. 结束或终止后台中的进程
语法:kill %n
n:利用jobs命令查看出的后台作业号
例如:
kill % 终止在后台中的第一个进程。
kill %2 终止在后台中的第二个进程。

命令管道

语法:命令1 | 命令2 将命令1的执行结果送到命令2,做为命令2的输入。
例如:
ls -Rl | more 以分页方式列出当前目录及其子目录下所有文件的名称。
cat file1 | more 以分页方式列出文件file1 的内容。
 
 
输入输出控制
1. 标准输入的控制
语法:命令< 文件将文件做为命令的输入。
例如:
mail -s “mail test” wesongzhou@hotmail.com < file1 将文件file1 当做信件的内容,主
题名称为mail test,送给收信人。
2. 标准输出的控制
语法:命令> 文件将命令的执行结果送至指定的文件中。
例如:
ls -l > list 将执行“ls -l” 命令的结果写入文件list 中。
语法:命令>! 文件将命令的执行结果送至指定的文件中,若文件已经存在,则覆盖。
例如:
ls -lg >! list 将执行“ls – lg” 命令的结果覆盖写入文件list 中。
语法:命令>& 文件将命令执行时屏幕上所产生的任何信息写入指定的文件中。
例如:
cc file1.c >& error 将编译file1.c 文件时所产生的任何信息写入文件error 中。
语法:命令>> 文件将命令执行的结果附加到指定的文件中。
例如:
ls – lag >> list 将执行“ls – lag” 命令的结果附加到文件list 中。
语法:命令>>& 文件将命令执行时屏幕上所产生的任何信息附加到指定的文件中。
例如:
cc file2.c >>& error 将编译file2.c 文件时屏幕所产生的任何信息附加到文件error 中。

shell技巧

1.test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,
其测试符和相应的功能分别如下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真
(3)文件测试:
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,
其优先级为:“!”最高,“-a”次之,“-o”最低。
同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2
var2=$[var1*10+1]
则:var2的值为21。
2.if条件语句
if [ -x /sbin/quotaon ]; then
echo “Turning on Quota for root filesystem”
/sbin/quotaon /
elif [ -x /sbin/quotaon ]; then
/usr/bin/bash
else
echo “ok”
fi
3.for 循环
#!/bin/sh
WORD=”a b c d e f g h i j l m n o p q r s t u v w x y z”
for i in $WORD ; do
echo $i
done
#!/bin/sh
FILES=ls /txt/*.txt
for txt in $FILES ; do
doc=echo $txt | sed "s/.txt/.doc/"
mv $txt $doc
done
4.while和until 循环
#!/bin/sh
while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done
#!/bin/sh
until [ -f /var/run/ppp0.pid ] ; do
sleep 1
done
Shell还提供了true和false两条命令用于建立无限循环结构的需要,
它们的返回状态分别是总为0或总为非0
5.case 条件选择
#!/bin/sh
case $1 in
start | begin)
echo “start something”
;;
stop | end)
echo “stop something”
;;
*)
echo “Ignorant”
;;
esac
case表达式中也可以使用shell的通配符(“*”、“?”、“[ ]”)。
6.无条件控制语句break和continue
break 用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句
而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。
7.函数定义
在shell中还可以定义函数。函数实际上也是由若干条shell命令组成的,
因此它与shell程序形式上是相似的,不同的是它不是一个单独的进程,
而是shell程序的一部分。函数定义的基本格式为:
functionname
{
若干命令行
}
调用函数的格式为:
functionname param1 param2 ……
shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,
因此函数也可以作为if、while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时
shell将把这些参数分别赋予相应的位置参数$1、$2、…及$*。
8.命令分组
在shell中有两种命令分组的方法:“()”和“{}”,前者当shell执行()
中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、
当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括
弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰;
{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们
要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转
义符(\)以便让shell知道它们不是用于命令执行的控制所用。
9.信号
trap命令用于在shell程序中捕捉到信号,之后可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,
将执行双引号中的命令串。
trap ‘commands’ signal-list
trap “commands” signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号:
trap ” ” signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止
(如执行exit语句)时发出该信号。
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将
shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样
将很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell
不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体
的值来替换。
10. 运行shell程序的方法
执行shell程序的方法有三种:
(1)sh shell程序文件名
格式为:
bash shell 程序文件名
这实际上是调用一个新的bash命令解释程序,而把shell程序文件名作为参数传递给它。
新启动的shell将去读指定的文件,执行文件中列出的命令,当所有的命令都执行完结束。
该方法的优点是可以利用shell调试功能。
(2)sh<shell程序文件名
格式为:
bash<shell 程序文件名
这种方式就是利用输入重定向,使shell命令解释程序的输入取自指定的程序文件。
(3)用chmod命令使shell程序成为可执行的
11. bash程序的调试
bash -选择项 shell程序文件名
几个常用的选择项是:
-e:如果一个命令失败就立即退出
-n:读入命令但是不执行它们
-u:置换时把未设置的变量看作出错
-v:当读入shell输入行时把它们显示出来
-x:执行命令时把命令和它们的参数显示出来
上面的所有选项也可以在shell程序内部用“set -选择项”的形式引用,而“set +选择项”则
将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时,则可以将该部分用
上面两个语句包围起来。
1.未置变量退出和立即退出
未置变量退出特性允许用户对所有变量进行检查,如果引用了一个未赋值的变量就终止shell
程序的执行。shell通常允许未置变量的使用,在这种情况下,变量的值为空。如果设置了未
置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退
出选择项为“-u”。
当shell运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时,如
果未经重新定向,该出错信息会打印在终端屏幕上,而shell程序仍将继续执行。要想在错误发
生时迫使shell程序立即结束,可以使用“-e”选项将shell程序的执行立即终止。
2.shell程序的跟踪
调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”
选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell
在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量
和该变量所取的值也显示出来,因此,它们的主要区别在于:在执行命令行之前无“-v”则打印出命
令行的原始内容,而有“-v”则打印出经过替换后的命令行的内容。
除了使用shell的“-v”和“-x”选择项以外,还可以在shell程序内部采取一些辅助调试的措施。
例如,可以在shell程序的一些关键地方使用echo命令把必要的信息显示出来,它的作用相当于C语
言中的printf语句,这样就可以知道程序运行到什么地方及程序目前的状态。
12. bash的内部命令
bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell本身提供。
常用的内部命令有:echo、eval、exec、export、readonly、read、shift、wait和点(.)。
下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上打印出由arg指定的字符串。
2.eval
命令格式:eval args
功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后
执行。
3.exec
命令格式:exec 命令 命令参数
功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,
当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec
后面的语句将不再被执行。
4.export
命令格式:export 变量名 或:export 变量名=变量值
功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。
但子shell不能用export把它的变量向上带入父shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly 变量名
功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出
所有只读的shell变量。
6.read
命令格式:
read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2……在程序中
每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,
直到减到0。
8.wait
功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。
9.exit
功能:退出shell程序。在exit之后可有选择地指定一个数字作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。
13. 特殊参数:
1. $*: 代表所有参数,其间隔为IFS内定参数的第一个字元
2. $@: 与*星号类同。不同之处在於不参照IFS
3. $#: 代表参数数量
4. $?: 执行上一个指令的返回值
5. $-: 最近执行的foreground pipeline的选项参数
6. $$: 本身的Process ID
7. $!: 执行上一个背景指令的PID
8. $_: 显示出最後一个执行的命令

分类: shell 标签:

shell脚本中显示安装进度条

2011年3月16日 1 条评论

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/afantii/archive/2008/05/07/2412912.aspx

分类: shell 标签:

mysql备份脚本

2011年3月7日 没有评论

分类: DB 标签: ,

正则表达式口诀

2011年2月18日 没有评论
正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$)特殊符号认不了,弄个倒杠来引路; (指\. \*等特殊符号)
倒杠后面跟小w, 数字字母来表示; (\w跟数字字母;\d跟数字)
倒杠后面跟小d, 只有数字来表示;
倒杠后面跟小a, 报警符号嘀一声;
倒杠后面跟小b, 单词分界或退格;
倒杠后面跟小t, 制表符号很明了;
倒杠后面跟小r, 回车符号知道了;
倒杠后面跟小s, 空格符号很重要;
小写跟罢跟大写,多得实在不得了;
倒杠后面跟大W, 字母数字靠边站;
倒杠后面跟大S, 空白也就靠边站;
倒杠后面跟大D, 数字从此靠边站;
倒框后面跟大B, 不含开头和结尾;
单个字符要重复,三个符号来帮忙; (* + ?)
0 星加1 到无穷,问号只管0 和1; (*表0-n;+表1-n;?表0-1次重复)
花括号里学问多,重复操作能力强; ({n} {n,} {n,m})
若要重复字符串,园括把它括起来; ((abc){3} 表示字符串“abc”重复3次 )
特殊集合自定义,中括号来帮你忙;
转义符号行不通,一个一个来排队;
实在多得排不下,横杠请来帮个忙; ([1-5])
尖头放进中括号,反义定义威力大; ([^a]指除“a”外的任意字符 )
1竖作用可不小,两边正则互替换; (键盘上与“\”是同一个键)
1竖能用很多次,复杂定义很方便;
园括号,用途多;
反向引用指定组,数字排符对应它; (“\b(\w+)\b\s+\1\b”中的数字“1”引用前面的“(\w+)”)
支持组名自定义,问号加上尖括号; (“(?<Word>\w+)”中把“\w+”定义为组,组名为“Word”)
园括号,用途多,位置指定全靠它;
问号等号字符串,定位字符串前面; (“\b\w+(?=ing\b)”定位“ing”前面的字符串)
若要定位串后面,中间插个小于号; (“(?<=\bsub)\w+\b”定位“sub”后面的字符串)
问号加个惊叹号,后面跟串字符串;
PHPer都知道, !是取反的意思;
后面不跟这一串,统统符合来报到; (“\w*d(?!og)\w*”,“dog”不符合,“do”符合)
问号小于惊叹号,后面跟串字符串;
前面不放这一串,统统符合来报到;
点号星号很贪婪,加个问号不贪婪;
加号问号有保底,至少重复一次多;
两个问号老规矩,0次1次团团转;
花括号后跟个?,贪婪变成不贪婪;
还有很多装不下,等着以后来增加
附件
分类: shell 标签: