一、基础知识
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
二、编程
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 [email protected] < 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
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编程疑难解答