码迷,mamicode.com
首页 > 系统相关 > 详细

shell语句规则

时间:2016-08-04 19:45:14      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:表达式

一、if 条件语句

格式:

if 条件表达式

then #当条件为真时执行以下语句

命令列表

else #为假时执行以下语句

命令列表

fi

if 语句也可以嵌套使用

if 条件表达式 1

then

if 条件表达式 2

then

命令列表

else

if 条件表达式 3

then

命令列表

else

命令列表

fi

fi

else

命令列表

fi

你可以进行多层嵌套 一个 if 语句一定要跟一个 fi 表示该层条件结束 否则会造成语法错误

结合前面讲的 举例如下:

这里先讲一个条件语句中用到的命令 test 表示测试 test 后面的条件是否为真

if test -f "$1"

then

lpr $1

else

if test -d "$1"

then

cd $1

lpr $1

else

echo "$1 不是文件或目录"

fi

fi

以上的例子还可以改成如下所示

if test -f "$1"

then

lpr $1

elif test -d "$1" #elif 同 else if

then

(cd $1;lpr $1)

else

echo "$1 不是文件或目录"

以上的例子不知您是否看懂是什么意思吗?

假如我们现在将这个例子保存为 prfile

chmod +x prfile

执行刚才的程序

./prfile aaa

这个例子是检查你的输入的参数是否是一个文件 如果是就打印 如果是一个目录 先转目录再打印 如果

即不是文件也不是目录给出提示

二、多重条件测试语句 case

格式:

case 字串 in

模式) 命令列表;;

模式) 命令列表;;

....

esac

多重条件语句是以 case 开始以 esac 结束 中间可以有多个条件列表 功能是测试字串和和里面的模式有

没有匹配的,有就执行里面的命令列表 模式也可以是*号 表示任意字串,每个模式里面的最后要心;;双引

号结束,否则会发生语法错误。

 while 循环

while 命令格式

while 条件表

do

命令表

done


Sum=0

i=0

while [ $i != "100" ]

do

i=`expr $i + 1`

Sum=`expr $Sum + $i`

done

echo $i $Sum

这个程序的运算就是将 1 到 100 加起来


Sum=0

i=0

until [ $i = "100" ]

do

i=`expr $i + 1`

Sum=`expr $Sum + $i`

done

echo $i $Sum

当 i 不等于 100 时循环 就是当条件为假时循环,否则就退出,而第一个例子是当 i 不等于 100

时循环,也就是测试条件为真时循环.


for 循环

命令格式:

for 变量 in 名字列表

do

命令列表

done

三.循环控制语句

break 命令不执行当前循环体内 break 下面的语句从当前循环退出.

continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行


shell 的嵌入命令

QUOTE:

: 空,永远返回为 true

. 从当前 shell 中执行操作

break 退出 for、while、until 或 case 语句

cd 改变到当前目录

continue 执行循环的下一步

echo 反馈信息到标准输出

eval 读取参数,执行结果命令

exec 执行命令,但不在当前 shell

exit 退出当前 shell

export 导出变量,使当前 shell 可利用它

pwd 显示当前目录

read 从标准输入读取一行文本

readonly 使变量只读

return 退出函数并带有返回值

set 控制各种参数到标准输出的显示

shift 命令行参数向左偏移一个

test 评估条件表达式

times 显示 shell 运行过程的用户和系统时间

trap 当捕获信号时运行指定命令

ulimit 显示或设置 shell 资源

umask 显示或设置缺省文件创建模式

unset 从 shell 内存中删除变量或函数

wait 等待直到子进程运行完毕


sed 编辑命令

p 打印匹配行

= 显示文件行号

a \ 在定位行号后附加新文本信息

i \ 在定位行号后插入新文本信息

d 删除定位行

c \ 用新文本替换定位文本

s 使用替换模式替换相应模式

r 从另一个文件中读文本

w 写文本到一个文件

q 第一个模式匹配完成后推出或立即推出

l 显示与八进制 A S C I I 代码等价的控制字符

{ } 在定位行执行的命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式 2 粘贴到/pattern n/

y 传送字符

n 延续到下一输入行;允许跨行的模式匹配语句


sed  和正则表达式

s e d 识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使

用( \)屏蔽其特殊含义


$ sed -e ‘/^#/d‘ /etc/services | more

这将导致 sed  删除任何匹配的行。删除以 # 开头的行


QUOTE:

规则

表达式 描述

/./  将与包含至少一个字符的任何行匹配

/../  将与包含至少两个字符的任何行匹配

/^#/  将与以 ‘#‘  开始的任何行匹配

/^$/  将与所有空行匹配

/}^/  将与以 ‘}‘ (无空格)结束的任何行匹配

/} *^/  将与以 ‘}‘  后面跟有零或多个空格结束的任何行匹配

/[abc]/  将与包含小写 ‘a‘ 、 ‘b‘  或 ‘c‘  的任何行匹配

/^[abc]/  将与以 ‘a‘ 、 ‘b‘  或 ‘c‘ 开始的任何行匹配


$ sed -n -e ‘/BEGIN/,/^END/p‘ /my/test/file | more

如果没发现 "BEGIN" ,那么将不打印数据。如果发现了 "BEGIN" ,但是在这之后的所有行中都没发现

"END" , 那么将打印所有后续行。 发生这种情况是因为 sed  面向流的特性 --  它不知道是否会出现 "END" 。

$ sed -e ‘s/.$//‘ mydos.txt > myunix.txt

该脚本的工作原理很简单:替代规则表达式与一行的最末字符匹配,而该字符恰好就是回车。我们用空字符

替换它,从而将其从输出中彻底删除。如果使用该脚本并注意到已经删除了输出中每行的最末字符,那么,

您就指定了已经是 UNIX  格式的文本文件。也就没必要那样做了!


$uniq -u d c -f input-file out-file

QUOTE:

其选项含义:

-u 只显示不重复行。

-d 只显示有重复数据行,每种重复行只显示其中一行

-c 打印每一重复行出现次数。

-f n 为数字,前 n 个域被忽略。

一些系统不识别- f 选项,这时替代使用- n。


在/ l o g s  目录中查找更改时间在 5  日以前的文件并删除它们:

[ - ]

CODE:

$ find logs -type f -mtime +5 -exec rm {} \;

为了查找当前文件系统中的所有目录并排序,可以用:

[code]$ find . -type d -print -local -mount |sort

# find . -type d | sort

CODE:

(cmd1;cmd2;...;cmdN)#在一个子 shell 里执行一组命令

{cmd1;cmd2;...;cmdN}# 在当前 shell 里执行一组命令

这是一个基本概念


原帖由 " 网中人 "  发表:

abc: 表示 abc 三個連續的字符, 但彼此獨立而非集合. (可簡單視為三個 char. set)

(abc): 表示 abc 這三個連續字符的集合. (可簡單視為一個 char. set)

a|b: 表示單一字符, 或 a 或 b .

(abc|xyz): 表示或 abc 或 xyz 這兩個 char. set 之一. (註二)

[abc]: 表示單一字符, 可為 a 或 b 或 c . (與 wildcard 之 [abc] 原理相同)

[^abc]: 表示單一字符, 不為 a 或 b 或 c 即可. (與 wildcard 之 [!abc] 原理相同)


CODE:

^ 只只匹配行首

$ 只只匹配行尾

* 只一个单字符后紧跟*,匹配 0 个或多个此单字符

[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-

表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]

\ 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l 中一些元字符有

特殊含义。\可以使其失去应有意义

. 只匹配任意单字符

p a t t e r n \ { n \ } 只用来匹配前面 p a t t e r n 出现次数。n 为次数

p a t t e r n \ { n,\ } m 只含义同上,但次数最少为 n

p a t t e r n \ { n,m \ } 只含义同上,但 p a t t e r n 出现次数在 n 与 m 之间

2 、行首 以^ 匹配字符串或字符序列

^只允许在一行的开始匹配字符或单词。

用 例如,使用 ls -l  命令,并匹配目录。

[ - ]

CODE:

$ ls -l | grep ^d

例二:匹配所有空行:^ $

例三:只返回包含一个字符的行:^.$

QUOTE:

在正则表达式中匹配以* . p a s 结尾的所有文件:

\ * \ . p a s

即可屏蔽字符*的特定含义。

CODE:

A \ { 2 \ } B

匹配值为 A A B

CODE:

A \ { 2 , 4 \ } B

则结果为 A A B、A A A B、A A A A B,而不是 A B 或 A A A A A B 等。

格式如下:前 4 个字符是数字,接下来是 x x,最后 4 个也是数字,操作如下:

[ 0 - 9 ] \ { 4 \ }X X[ 0 - 9 ] \ { 4 \ }

CODE:

^ 对行首

$ 对行尾

^ [ t h e ] 对以 t h e 开头行

[ S s ] i g n a [ l L ] 对匹配单词 s i g n a l、s i g n a L、S i g n a l、S i g n a L

[Ss]igna[lL]\. 对同上,但加一句点

[ m a y M A Y ] 对包含 m a y 大写或小写字母的行

^ U S E R $ 对只包含 U S E R 的行

[tty]$ 对以 t t y 结尾的行

\ . 对带句点的行

^ d . . x . . x . . x 对对用户、用户组及其他用户组成员有可执行权限的目录

^ [ ^ l ] 对排除关联目录的目录列表

[ . * 0 ] 对 0 之前或之后加任意字符

[ 0 0 0 * ] 对 0 0 0 或更多个

[ iI] 对大写或小写 I

[ i I ] [ n N ] 对大写或小写 i 或 n

[ ^ $ ] 对空行

[ ^ . * $ ] 对匹配行中任意字符串

^ . . . . . . $ 对包括 6 个字符的行

[a- zA-Z] 对任意单字符

[ a - z ] [ a - z ] * 对至少一个小写字母

[ ^ 0 - 9 \ $ ] 对非数字或美元标识

[ ^ 0 - 0 A - Z a - z ] 对非数字或字母

[ 1 2 3 ] 对 1 到 3 中一个数字

[ D d ] e v i c e 对单词 d e v i c e 或 D e v i c e

D e . . c e 对前两个字母为 D e,后跟两个任意字符,最后为 c e

\ ^ q 对以^ q 开始行

^ . $ 对仅有一个字符的行

^\.[0-9][0-9] 对以一个句点和两个数字开始的行

‘ " D e v i c e " ‘ 对单词 d e v i c e

D e [ V v ] i c e \ . 对单词 D e v i c e 或 d e v i c e

[ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } 对日期格式 d d - m m - y y y y

[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } 对 I P 地址格式 nnn. nnn.nnn.nnn

[ ^ . * $ ] 对匹配任意行

作者: 網中人 时间: 2004-11-16 13:

2 、  行匹配

1)显示包含“4 8”字符串的文本:

[ - ]

CODE:

$ grep -c "48"data.f

4

g r e p 返回数字 4,表示:包含字符串“4 8”的有 4 行。

3) 行数

显示满足匹配模式的所有行行数:

[ - ]

CODE:

$ grep -n "48"data.f

行数在输出第一列,后跟包含 4 8 的每一匹配行。

4) 显示非匹配行

显示所有不包含 4 8 的各行

[ - ]

CODE:

$ grep -v "48"data.f

1 、模式范围

抽取代码为 4 8 4 和 4 8 3 的城市位置,可以使用[ ]来指定字符串范围。

[ - ]

CODE:

$ grep "48[34]" data.f

2 、不匹配行首

使行首不是 4 或 8,可以在方括号中使用^记号。

[ - ]

CODE:

$ grep "^[^48]" data.f


shell语句规则

标签:表达式

原文地址:http://21024.blog.51cto.com/11024/1834358

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!