shell 学习第一部分
时间:2008-12-16 来源:huoyun
Bash_shell
第一行开始为:
#!/bin/bash
注释符 #
通配符 *,?,[,]
局部变量 name = “CLQ”
全局变量 export name=CLQ
提取变量值: echo $name ; echo$PATH
读取用户输入: read name 从用户输入中读取一行
参数: echo $1 $2 $3 位置参数
echo $* 所有位置参数
echo$# 位置参数的个数
命令替换 name = `command`
name=$(command)
例: echo ”Today is `date`”
echo ”Today is $(date)”
运算符
== 等于 =! 不等于 && 与 || 或 ! 非
一、条件语句
1: if结构 (if开始 fi结束)
模式1 if command
then
block of statements
fi
模式2 if [[expression]]
then
block of statements
fi
模式3 if ((numeric expression))
Then
block of statements
else
block of statements
fi
2: if/else 结构
模式1 if command
then
block of statemants
else
block of statemants
fi
3: if/else/else if
if command
then
block of statements
elif command
then
block of statements
else if command
then
block of statements
else
block of statements
fi
4: cace 结构
case variable_name in
pattern1)
statements
; ;
Patern2)
; ;
Pattern3)
; ;
Esac
二、循环语句
四种类型(while、unti、for、select)
1、 while command
do
Block of statements
Done
2、 unti command
do
Block of statements
done
3、for
for variable in word_list
do
block of statements
done
4、select
select variable in word_list
do
block of statements
done
正则表达式与模式匹配
^ 行首定位符号 /^love/ 匹配以love开头的行
$ 行尾定位符 /love$/
. 匹配单个字符
* 匹配0或者多个字符
[] 匹配一组字符中的任意一个 [Ll]ove
[x-y] 匹配范文
[^] 匹配不在范围内的字符
\ 转义字符
\< 行首定位符
\> 行尾定位符
grep
正则表达式有效
-b 在每一行前面加上其所有在的块号
-c 显示匹配到行的数目,而不显示行的内容
-h 不显示文件名
-i 比较字符时,忽略大小写
-l 只列出匹配行所在的文件名
-n 每一行前面加上他在文件中的行号
-v 反向查找,只显示不匹配的行
-w 把表达式作为词来查找
sed 命令与选项
a\ 当前行后添加一行或多黄
c\ 用新文本修改(替换)当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 取出缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G 取出缓存区的内容,将其复制到模式空间,追加在原有内容后面
i 累出非打印列
p 打印所有列
n 输入下一输入行,并从下一条命令而不是第一套命令开始对器进行处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个.
替换标志
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区与模式空间的内容
y 将字符转换为另一字符(不能对正则表达式使用y命令)
sed 实用范例
sed –n ‘/tihuan/p’ filename 把文件中所有 包含 tihuan的 行打印在屏幕上
sed ‘1,3d’filename 把文件钟的前3行删除,并且打印在屏幕上
sed ‘[Dd]ata/d’ filename 把包含Data和data的行删除
sed –n ’15,20p’ filename 打印第15-20行
sed ‘1,10s/MT/mt/g’ filename 将第1~10行的所有MT换成mt
sed ‘/MT/!d’ filename 删除不含MT的行
sed ‘/MT/5/8’ filename 把所有包含MT的行的第一个5换为8
sed ‘s/….//’ filename 删除每行的前4个字符
sed ‘s/…$//’ filename 删除每行的后3个字符
sed ‘/east/,/west/s/North/Sounth/’ filename 降east到 west这个范围内所有行出现的North更换为 Sounth
sed –n ‘/Time off/w timefile’ filename 将所有包含time off的行 写入到timefile文件中
sed ‘s/\([Oo]ccur\)ence/\lrence/’ file
sed –n ‘l’ filename 打印所有以 \nn显示非打印字符(nn是字符的十进制值)
AWK
Print函数转义序列
\b 退格
\f 换页
\n 换行
\r 回车
\t 制表符
\047 八进制的47,即单引号
\c C代表任一 其他字符,例如”\”
Printf函数
c 字符
s 字符串
d 十进制整数
ld 十进制长整数
u 十进制无符号整数
lu 十进制无符号长整数
x 十六进制整数
lx 十六进制长整数
o 八进制
lo 八进制长
e 用科学计数法
f 浮点数
g 选用e或f钟较短的一种形式
printf修饰符
- 左对齐修饰符
# 显示8进制证书时在前面加个0
+ 显示使用d,e,f和g转换的整数时,加上正负好
0 用0而不是空白来填充所显示的值
例: print(“The character is %c\n”,x) 假设x=’A’ 输出:The character is A
操作(action)
操作是用{}花扩话分隔的语句
记录与字段
变量 $0 指代整条记录
RS 默认的内置变量 默认为回车
NR 每条记录的记录号,保存在NR中
FS 保存输入字段分割符的值
-F 在命令行上改变FS的值,要使用-F选项
POSIX
[:alnum:] 字符数字字符
[:alpha0:] 字母字符
[:cntrl:] 控制字符
[:digit:] 数字字符
[:graph:] 非空白字符(非空格,控制字符等)
[:lower:] 小写字母
[:print:] 与[:graph:]功能类似,但是包含空格字符
[:punct:] 标点字符
[:space:] 所有的空白字符(换行符,空格,制表符)
[:upper:] 大写字母
[:xdigit:] 允许十六进制的数字(0-9a-fA-F)
比较表达式
关系运算符
< <+ == != >= >
~ 与正则表达式匹配
!~ 与正则表达式不匹配
条件表达式
条件表达式1 ? 表达式2 : 表达式3
相当于
if ($1 > $1)
max=$1
else
max=$2
逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
范围模式
awk ‘/Char1/,/Char2/’ filename
打印第一次出现char1和 char2 之间的字符
变量
= a = 5
+= a += 5 -= *= /= %= ^=
nawk –v 允许在BEGIN语句中处理命令行变量
内置变量
AGRC 命令行参数的数目
ARGIND 命令行中当前文件在ARGV内的索引(仅用于gawk)
AGRV 命令行参数构成的数值
CONVFMT 数字转换格式,默认为%.6g(仅用于gawk)
ENVIRON 包含当前shell环境变量值的数组
ERRNO 当使用getline函数进行读操作或者使用close函数时,因重定向炒作而产生的系
FIELDWIDTHS 在分隔固定宽度的列表时,使用空白而不是FS进行分隔的字段宽度列表
FNR 当前文件的记录数
FS 输入字段分隔符,默认为空格
IGNORECASE 在正则表达式
NF 当前记录中的字段数
NR 目前的记录数
OFMT 数字的输出格式
OFS 输出字段分隔符
ORS 输出纪录分隔符
RLENGTH match函数匹配到的字符串的长度
RS 输入记录分隔符
RSTART match函数匹配到的字符串的偏移量
RT 纪录终结符,对与匹配字符或者RS指定的regex,gawk将RT设置到输入文本
SUBSEP 数组下标分隔符
BEGIN ; END 模式
重定向和管道
命令行编辑器
VI
ESC K或+ |
上移历史清单 |
ESC J 或- |
下移历史清单 |
G |
移动到历史文件的第一行 |
5G |
移动到第五行 |
/string |
向上搜索字符串string |
? |
向下搜索字符串 |
h |
在一行中左移 |
l |
在一行中右移 |
b |
向后移动一个词 |
e或w |
向前移动一个词 |
^或0 |
移动到行首 |
vi编辑 |
|
a A |
添加文本 |
i I |
插入文本 |
dd dw x |
删除文本到缓存 |
cc C |
修改文本 |
u U |
撤销 |
yy Y |
移出(把一行复制到缓存) |
p P |
吧一处或删除的行放在该行下面或上面 |
r R |
在一行中替换一个粗木或者任意大小的文本 |
|
|
|
|
别名 alias
1 创建别名 alias 123=456
2 删除别名 unalisa
变量
变量分为局部变量和环境变量
变量的命名 变量必须要以字母或下划线字符开头,其余的字符可以是字母、数字或者下划线。
变量的赋值 等号周围不能有任何空白符。为了给变量赋值,可以在等号后面加一个换行符。
1、 局部变量 变量=值
内置命令 1、declare (bash) 2、typeset(Korn shell)
两个内置变量可以用来创建变量
格式 declare 变量=值
选项
-a 将变量当作一个数组。即,分配元素
-f 列出函数的名称和定义
-F 只列出函数名
-i 将变量设为整型
-r 将变量设置为只读
-x 将变量名称输入到子shell中
环境变量设置 export
-- 标志着选项末尾,余下的参数被视为变量
-f 名-值对被看作函数,而不是变量
-n 将一个全局(导出)变量转换成局部变量。之后该变量将不能被导出到子进程中。
-p 显示所有全局变量
复位变量
unset name
显示变量值
echo 命令
数组
declare - a 名字 -r参数表示只读
variable=(char char2 …………)