Shell编程总结
在Unix中有两种主要类型的Shell:
Bourne Shell(sh, ksh, bash) : prompt:#
C Shell (csh ,tcsh) : prompt: %
如果是root用户 都用#做为提示符
内核在计算机引导时被装入内存
Shell在登录时被装入内存
工具在使用时装入内存
Shell初始化时要读的两个文件:(用于设置一些变量)
/etc/profile
~/profile
要使脚本可执行
有可执行的权限 chmod a+x
确保脚本使用正确的Shell #!/bin/sh(必须在第一行.不然会被当成注释)
Unix下分三种基本类型的文件
普通文件:数据,文本或程序指令
目录文件
特殊文件
文件名第一个字符为点的是不可见文件,来存储配置信息
.profile .cshrc
不同文件类型的特殊字符(ls -l)
- 普通文件
l 符号链
c 字符特殊文件
b 块特殊文件
p 命名管道
s Socket
d 目录文件
辨别一个普通文件是二进制程序 Shell脚本 还是库
file filename
设备文件(/dev)
字符特殊文件:每次一次字符与设备通信的机机制
块特殊文件(块设备):通过文件系统与设备驱动程序通信的机制
chmod 八进制方式是设置而不是修改文件的权限
chown:Change Owner
chgrp:Change group
在UNIX中无论何时执行一个命令,它都创建或启动一个新进程
启动一个后台进程最简单的方式是在命令的后面添加一个&符号
把前台进程移到后台
susp前台进程(^z)
bg命令使用户能把susp的进程置到后台
fg命令使用户能把susp的进程置到后台
缺省情况下,bg命令把最近的悬挂进程移到后台,用户可以一次悬挂多个进程,
为区别,在命令行的任务标识号加上%做为前缀
后台进程持续运行(nohup)
如果没有重定向文件中,自动重定向到一个叫做nohup.out的文件
eg: nohup ls > results &
等待后台进程结束(wait命令)
jobs命令为用户显示出悬挂的以及正在后台运行的进程
ps显示正在运行的所有进程(process status)
ps –a 显示所有用户的信息
ps –x 显示没有终端的进程的信息(nohup)
ps –u 显示额外的信息
kill并不物理地杀死进程,它给进程发一个信号,缺省情况下,它发出TERM(15)信号.
如果进程忽略了常规的kill命令 用户可以应用kill -9,以强迫进程结束
缺省情况下,一个进程使用运行它的用户的权限
覆盖当前进程: exec
变量总是成对出现..没有数据类型的概念..使用空格要引用
访问变量 在变量名之前加上$(类似于PHP)
数组变量
name[index]=value name_index=value
set –A name value1 value2 ... valuen
name=(value1...valuen)
访问数组变量
${name[index]}
访问数组中的所有项: ${name[*]} ${name[@]}
只读变量 readonly name
删除变量 unset name
环境变量
局部变量:只在当前Shell实例中存在的变量
环境变量:是Shell的任何子进程都能使用的变量
Shell变量:Shell设置的特殊变量 : PWD HOME PATH
export name :导出将变量放入环境中
文件名替换的通配符:
*:匹配零个或多个存在的任何字符
?:匹配一个存在的任何字符
[characters] :匹配任何给出字符characters之一
变量替换
${parameter:-word} : 变量未被设置或为空时,替换缺省值
${parameter:=word} : 为变量赋值
${parameter:?message} : 当变量被删除时向标准错误输出写一条信息
${parameter:+word} : 变量已设置时替换
命令替换: `command`
算术替换: $((expression))
引用:
/ 下一个字符两边加单引号
‘’ 所有字符有效
“” 变量自动替换
引用规则:
引用忽略了单词边界
命令中的组合引用
在单个参数中嵌入空格
引用换行符达到在下一行续行的目的
为访问包含特殊字符的文件名而引用
引用正则表达式通配符
转义字符
if语句
if list1
then
list2
elif list3
then
list4
else
list5
fi
test expression 缩写 [expression] 0真 1 假
1)判断表达式
if test (表达式为真)
if test !表达式为假
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
2)判断字符串
test –n 字符串 字符串的长度非零
test –z 字符串 字符串的长度为零
test 字符串1=字符串2 字符串相等
test 字符串1!=字符串2 字符串不等
3)判断整数
test 整数1 –eq 整数2 整数相等
test 整数1 –ge 整数2 整数1大于等于整数2
test 整数1 –gt 整数2 整数1大于整数2
test 整数1 –le 整数2 整数1小于等于整数2
test 整数1 –lt 整数2 整数1小于整数2
test 整数1 –ne 整数2 整数1不等于整数2
4)判断文件
test File1 –ef File2 两个文件具有同样的设备号和i结点号
test File1 –nt File2 文件1比文件2 新
test File1 –ot File2 文件1比文件2 旧
test –b File 文件存在并且是块设备文件
test –c File 文件存在并且是字符设备文件
test –d File 文件存在并且是目录
test –e File 文件存在
test –f File 文件存在并且是正规文件
test –g File 文件存在并且是设置了组ID
test –G File 文件存在并且属于有效组ID
test –h File 文件存在并且是一个符号链接(同-L)
test –k File 文件存在并且设置了sticky位
test –b File 文件存在并且是块设备文件
test –L File 文件存在并且是一个符号链接(同-h)
test –o File 文件存在并且属于有效用户ID
test –p File 文件存在并且是一个命名管道
test –r File 文件存在并且可读
test –s File 文件存在并且是一个套接字
test –t FD 文件描述符是在一个终端打开的
test –u File 文件存在并且设置了它的set-user-id位
test –w File 文件存在并且可写
test –x File 文件存在并且可执行
case语句
case word in
pattern1)
list1
;;
pattern2)
list2
;;
esac
while循环
while command
do
list
done
until循环
until command
do
list
done
for循环
for name in word1 ... wordN
do
list
done
select循环
select name in word1 word2 ... wordN
do
list
done
循环控制
break
continue
特殊变量
$0 正在被执行的名字
$n 该变量与脚本被激活时所带的参数相对应 第一个参数为$1 第二个参数为$2
$# 提供给脚本的参数号
$* 所有这些参数都被双引号引住 两个参数的话相当于$1$2
$@ 所有这些参数都分别被双引号引住
$? 前一命令执行后的退出状态
$$ 当前Shell 的进程号
$! 前一个后台命令的进程号
usage语句
echo “usage: $0 [option] [files]”
echo 与 printf(不会自动换行)
输出重定向
> 覆盖掉文件
>> 追加文件
tee 向文件和屏幕重定向输出 command | tee file
输入重定向
< <<
读取用户输入
read name
read LINE
管道(pipeline)可以将一个命令的输出重定向到另一个命令的输入
函数
name() {list ;}
Shell使用IFS变量的值将一个字符串分割成几个分开的单字
在csh中,提供了三个用于迅速在UNIX文件系统中移动的命令:
popd
pushd
dirs
在csh中,栈在Shell中维护,但在基于Shell函数的应用中,必须将栈维护成一个可导出的环境变量以便使所有的这三个函数都可以访问它
使用变量_DIR_STACK存储目录栈...类似于PATH
head 命令
head [-n lines] files 如果不指定-n默认是前10行
ls –lut /home | head -5
tail命令
tail [-n lines] files如果不指定-n默认是后10行
ls –lrt /home | tail -5
tail –f file 使用户即使当程序正在向文件写入时也可以查看该指定文件
eg: tail –f /var/log/httpd/access_log
grep
查找单词: grep word file
tr命令
tr ‘set1’ ‘set2’取出所有set1中的字符并将其转变成set2中的字符
sort命令
单词排序
uniq命令
删除所有重复的单词
awk和sed
command ‘script’ filenames
eval命令
:命令 空操作 用于返回一个完成代码“0”指示命令成功完成
type命令 告诉用户一个指定命令的全路径
sleep命令 用于暂停一段时间
find命令 find start-dir options actions
-name 指定一个确切文件名或部分文件名用于匹配
-type 指定要检索的文件类型
-mtime –atime –ctime
-size
-print –exec
xargs命令 从标准输入接收一系列单词并将这些单词提供给一个给定命令作为参数
cat filelist | xargs rm
expr命令 执行简单的整数算术运算
bc命令
信号
SIGHUP 1 检测控制终端的挂起或控制进程的死亡
SIGINT 2 键盘中断
SIGQUIT 3 从键盘退出
SIGKILL 9 杀死信号
SIGALRM 14 报警时钟信号(为计时器使用)
SIGTERM 15 终止信号
用户系统中所有能被理解的信号都列在C语言头文件signal.h中
kill –l也可以找出用户系统可以理解的信号列表
传递信号 kill
trap命令设置或取消接收到一个信号时的动作
trap “rm –f $TMPF; exit 2” 1 2 3 15
当收到HUP ,INT,QUIT或TERM就执行rm –f $TMPF; exit 2
忽略信号
trap ‘’ signals
trap : signals