写shell也有好几个月了,趁现在有时间,将一些东西整理到这里:
1. 测试文件状态
test condition
[ condition ]
-d 目录
-f 正规文件
-L 符号连接
-r 可读
-s 文件长度大于0, 非空
-w 可写
-u 文件有suid位设置
-x 可执行
逻辑操作符:
-a 逻辑与
-o 逻辑或
! 逻辑否,条件为假,结果为真
2.查找与替换:
:1,$s/p1/p2/g
将p1 用p2替换
:s/p1/p2/g
将当前行中的p1用p2替换
g/p1/s//p2/g
将文件中所有的p1均用p2替换
去掉换行符^M
:1,$ s/^M//g (ctl+v ctl+m)
3.几个shell中常用命令
basename用于从路径中分离出文件名
dirname 用于从路径中分离出纯路径部分
compress用于压缩文件 -v 显示压缩结果 压缩成.z格式文件
diff dir1 dir2 用于比较两个目录下文件的不同 -s 不显示相同文件
du 用于显示目录占用的空间 -a 显示每个文件大小 -s显示总计,大小均以512字节的块表示
file 用于确定文件或目录类型
fuser用于显示访问某个文件或文件系统的所有进程
-u 用于显示访问某个文件或文件系统的所有进程
-k 杀死所有访问该文件或文件系统的进程
logname 显示登录名
wc 显示文件大小
-c显示字符数
-l显示行数
-w显示单词数
date + %d-%m-%y (09-06-06)
date + %R (10:07)
date + %A" "%R" "%P (Wednesday 10:09 AM)
date + %T
添加目录
cvs add dir_name
查看修改历史
cvs log file_name
cvs history file_name
4. 常用语法
字符串的测试
字符串操作符:
= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
测试数值
数值操作符:
-eq 数值相等
-ne 数值不等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-le 第一个数小于等于第二个数
-ge 第一个数大于乖于第二个数
expr使用
expr argument operator argument
操作符和参数之间必须有空格
expr 10 + 10
expr 30 / 3
expr 30 \* 3
$LOOP=1
$LOOP=`expr $LOOP + 1 `
流控制
if condition1
then
command1
elif condition2
then
comand2
else
command3
fi
使用if 语句时必须将then 放在新行,如果一定要和if放在同一行,if语句须用分号分隔
case variable in
pattern1)
command1
command2
;;
pattern2)
command3
command4
;;
esac
取值后面必须为单词in,每一模式必须以右括号结束,取值可以为变量或常数,若无匹配模式,以*号捕获该值,再接受其它输入。
* 任意字符
?任意单字符
[..]类或范围中任意字符
模式匹配:
y|y|yes|Yes)
for循环:
for variable in List
do
command1
command2
done
在for循环中省去in List列表选项时,实际上是指:
for params in "$@"或
for params in "$*"
until condition
do
command1
command2
done
while condition
do
commnad1
commnad2
done
5.脚本调试
set命令
set -n 读命令但并不执行
set -v 显示读取的所有行
set -x 显示所有的命令及参数
6.cut用法
我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段