前段时间看的shell编程,边看边记下来的笔记,不过有些截图没能发上来,参考书籍《UNIX.Shell编程24学时教程》。
SHELL 编程一 UNIX 和 Shell 工具简介
一、基础知识
Shell 提供一个到 UNIX 系统的接口,它收集用户输入并根据输入执行程序,并显示程序的输出。有时被叫做命令解释器。
1 、命令:简单命令、复杂命令(带参数)、复合命令(分号隔开,如: who; ll )。
2 、 Shell 类型: Bourne Shell( 包括 sh, ksh, bash) 和 C Shell( 包括 csh, tcsh) 。
3 、模式:交互式和非交互式。
交互式启动: $/bin/sh 退出: exit
非交互式启动: $/bin/sh filename
4 、初始化文件 /etc/profile
使用的终端类型: TERM=vt100
定位命令列表: PATH=/bin:/usr/bin
定位命令帮助列表 :MANPATH=/usr/man:/usr/share/man
5 、执行 chmod a+x ./logins 例,内容为:
#!/bin/sh 位于第一行,而在其他行时 # 开头为注
who;ls;
6 、文件操作:
ls –aF; cat filename; wc filename; cp -i source destination;
mv –i source destination; rm files;
7 、目录操作:
pwd; cd directory; mkdir directory; cp - r source destination;
mv source destination; rmdir; rm –r;
8 、文件属性操作:
符号链(相当于快捷方式或别名)创建: ln –s source destination
管道
chmod expression files; (r,w,x,o; 4 读 ,2 写 ,1 执行 )
chown 改变一个文件的所有权 ; chown options user:group files
chgrp options group files
9 、进程
前台进程,后台进程。启动后台进程在命令后面添加 & 。
前移后: ctrl+z. 后移前: fg. 使后台进程持续运行: nohup
jobs( 显示悬挂的及正在后台运行的进程 ) ps( 正在运行的所有进程 ) kill
SHELL 编程二
二、编程
1 、变量
定义: name=value ( 使用带空格的值时加引号 )
访问: $name
例: FRUIT=apple $echo $FRUIT( 结果为 apple) $echo FRUIT( 结果为 FRUIT)
Bourne Shell 只支持标量, Korn Shell 中支持数组。
数组创建: name[index]=value 数组访问: ${name[index]}
只读变量: readonly name
删除变量: unset name
局部变量(只在当前 SHELL 实例中存在),环境变量( SHELL 任何子进程都能使用), SHELL 变量(正确运行所必需,如 PWD,PATH,HOME 等)。
导出环境变量: export name
2 、替换
( 1 )文件名替换通配符: * (匹配 0 个或多个)、?(匹配 1 个存在的任何字符)、 [characters] 。
匹配给出的字符,例 ls test[0123456789].sql 或 ls test[0-9].sql 。匹配所有以字母或数字结尾的文件: ls *[a-z A-Z 0-9] 。
否定一个集合:如列出所有除 a 开头的文件, ls [!a]* 。
( 2 )变量替换:
${parameter:-word} 若 parameter 为空或未设置,则用 word 代替, parameter 值不变
${parameter:=word} 若 parameter 为空或未设置,则 parameter 设为值 word
${parameter:?message} 若 parameter 为空或未设置,则 message 作为标准错误打印
${parameter:+word} 若 parameter 设置了,则用 word 代替, parameter 值不变
( 3 )命令和算术替换
例: DATE=’date’ UP=’date; uptime’
foo:$((5+3)/2)
3 、引用:关掉一个字符的特殊意义。
三种方式: / (关掉某个), ’ (关掉全部), ” (关掉部份)。
例: echo Hello /; world 输出 Hello ; world
echo ‘<125.**>;(update)’ 输出 <125.**>;(update)
双引号未关掉: $ 用于参数替换,后引号 ’ 用于命令替换, ” , / 。
4 、流控制
( 1 ) if 语法: if list1
then list2
elif list3
then list4
else list5
fi
其中 elif 和 else 可选。
例: #!/bin/sh
Fruit=apple
F=b
if $Fruit>$F;
then echo $Fruit
else echo $F
fi
使用 test : test expression ,可用文件测试、字符串比较、数字比较。
( 2 ) case 语法: case word in
pattern1) list1 ;;
Pattern2) list2 ;;
esac
其中 ;; 类似于 break 。
例: #!/bin/sh
Fruit=apple
case “$Fruit” in
apple) echo “I like apple.” ;;
banana) echo “banana” ;;
esac
运行后输出 I like apple.
条件可以运前之前学习的进行组合出复杂表达式。
5 、循环
( 1 ) while 语法: while command
do list
done
例:输出 1~10 。
#!/bin/sh
x=1
while [ $x –le 10 ]
do
echo $x
x=$(($x+1))
done
还可以进行嵌套。
( 2 ) until 语法: until command
do list
done
( 3 ) for 语法: for name in word1 word2…wordN
do list
done
例:输出 1~10 。
#!/bin/sh
x=1
for x in 1 2 3 4 5 6 7 8 9 10
do
echo $x
done
( 4 ) select 语法: select name in word1 word2…wordN
do list
done
( 5 ) break 和 continue 。
6 、参数(有些地方不明白)
处理参数和选项采用如下方法:使用 case 语句手工处理参数和选项,使用 getopts 处理选项。
( 1 )特殊变量
7 、输入输出
1 )向终端输出: echo 、 printf( 格式化输出,位于 /usr/bin 中 )
2 )输出重定向:
“ > ”(把输出的内容重定向到指定的文件中)
“ >> ”(把输出的内容追加到指定的文件尾部)
tee( 同时重定向到屏幕和文件 ) : command | tee file
3 )输入重定向
Command < file ,例: Mail kony.sun@gmail.com < File_Exam
Command << delimiter
Document
Delimiter
4) 读取用户输入
read name 直到用户输入回车为止。
5 )管道
6 )重定向到同一个文件
例: ll >file1 >&file2
8 、函数
1 )创建和使用
name( ) { list; } 例如: ls1( ) { ls –l; }
cd( ) { chdir ${1:-$HOME }; PSI=” ’pwd’ $” ; export PSI; }
激活: $name
2 )函数间协同工作并共享数据
略, P138
9 、文本过滤器
1 )最常用的有: head, tail, grep, sort, uniq, tr 。
2 ) head 格式: head [ -n lines ] files ,其中 [ -n lines ] 不写默认查看前 10 行,带的话指定前 n 行。
组合使用,例检索 5 个最常访问的文件: ls –l ut /home/public_html | head -5
3 ) tail 格式: tail [ -n lines ] files ,其中 [ -n lines ] 不写默认查看后 10 行,带的话指定后 n 行。
4 ) grep 格式: grep word file ,例: grep creat test2.sql test.sql
grep -i word file ,不考虑大小写。
grep -v word file/dir ,不包括该单词的。
grep -n word file ,一起写出行号。
grep -l word dir ,只列出包含它的文件名。
5 ) tr :将一个集合中的所有字符改变成别一个集合中的字符,也可用于删除字符集。
tr ‘set1’ ‘set2’
6 ) sort :为输入文件占的行进行分类。
例统计一个单词使用了多少次。
7 ) uniq :打印出文件中所有的唯一行。若某行多次,只打一个。
uniq filename
10 、使用正规表达式过滤文本
1 ) command ‘script’ filenames
command 是 awk 或 sed , script 是可以被 awk 或 sed 理解的命令清单, filenames 表示命令所作用的文件清单。
2 )正规表达式基本构造块包括:
普通字符:大小写字母、数字、字符。
元字符: . 、 * 、 [chars] 、 ^ 、 $ 、 / 。例 : /a.c/ 匹配如 a+c, a-c, abc 行。
3 ) 使用 sed
/p 打印 , /d 删除 , /s/pattern1/pattern2 将 2 代替 1 。
例 : $sed ‘/0/.[0-9][0-9]$/p’ fruit_prices.txt , 告诉 sed 打印所有匹配模式 /0/.[0-9][0-9]$ 的行。
11 、使用 awk 过滤文本
编程语言。(见详解)
12 、各种工具
1 ) eval 命令:第二次处理命令行时使用。
2 ):命令:返回一个完成代码 0 ,用于指示命令成功完成。
3 ) type 命令:告诉用户一个指定命令的全路径。
4 ) sleep 命令:暂停给定秒数, sleep n
5 ) find 命令:检索, find start-dir options actions ,例 find / -nme alpha –print
6 ) xargs 命令:从标准输入接收单词并将其提供给给定命令作为参数, cat filelist | xargs rm 。
7 ) expr 命令:执行简单整数算术运算, $expr 8/3
8 ) bc 命令:不局限于整数的算术工具。
9 ) remsh/rsh/rcmd/remote 命令:远程 Shell
SHELL 编程三高级主题
1 、信号处理
1 )信号位于 C 语言头文件 signal.h 中。
2 、调试
3 、使用函数解决问题
1 )创建库
创建 Shell 函数库就像创建 Shell 脚本,主要区别是库只包含函数,而脚本包含函数和主代码。
2 )使用库中包含的函数: .file
3 )常见函数: printERROR, printWARNING, pringUSAGE, promptRESPONSE, getSpaceFree, getSpaceUsed, getPID, getUID, toUpper, toLower, isSpaceAvailable, isUserRoot 。
4 、使用 Shell 脚本解决问题
5 、脚本可移植性
1 )判断 unix 版本: uname
操作系统发行版本号: uname –rs
硬件类型: uname –m
主机名: uname –n
2 )提高可移植性技巧:条件执行和抽取。
6 、 Shell 编程疑难解答