标签:表达式
一、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
标签:表达式
原文地址:http://21024.blog.51cto.com/11024/1834358