最近两天在学习shell编程,想将一些很零碎和干燥的东东记录下来,方便以后查用
1 重新认识shell
Shell是一个很重要的工具,从刚开始将它理解成一个命令集合的工具。以前对于shellscript中的奇怪字符弄得一头雾水,完全不能体会到shell的强大之处,其实现在也没怎么体会到!(自己汗一个!!)只不过是更加深入地学习了一下觉得自己更什么都不是了。由于工作中涉及到了这方面的知识,非常有必要学习一下。先把这些基础的东西记录下来,免得以后长时间不用搞忘了。
Example:
#!/bin/sh
# this is a test
Echo “this is a test”
Echo “ Today is `date` “
以上是test.sh的代码,运行方式有三种:
1. Bash test.sh
2. Bash<test.sh
3. 首先更改文件权限:chmod +x test.sh ,然后再运行 ./test.sh
2 Test
Test主要用于测试字符串、数字、文件。
格式:test condition
或者[ condition ](注意在[]的两边必须要留空格)
关于condition的介绍
1) 字符串:eg:test -n $string(测试变量string的值长度是否为零,若不为零则表示成功返回值为0,若为零则返回值为1,可以通过命令“echo$?”来查看返回值。除了“-n”之外还有“-z”表示长度为零的时候返回0,情况与前者相反)
2) 数字:-gt、-ge、-lt、-le、-eq(依次表达大于、大于等于、小于、小于等于、等于的情况)。Eg:test $1 –eq $2
3) 文件:-f 、-d、-r、-w、-x(依次代表是否问普通文件、是否为目录、文件是否可读、文件是否可写、文件是否可执行)。Eg:test -f test.txt
4) 逻辑判断条件:-o、-a、!(依次表达:或、与、非)。
Eg: [ $1 –gt1 -a $2 –eq 3 ](条件:第一个位置参数大于1并且第二个位置参数等于3)
3 引号
双引号(““)、单引号(‘’)、反引号(``)以及反斜杠(\)在shell中的应用非常普遍。
1) 双引号:双引号的作用是将除了一些特殊字符以外的字符作为一般的字符进行处理(特殊的字符包括$、`、\)
2) 单引号:将所有的字符都做为一般的字符进行处理
3) 反引号:反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量(反引号中的内容一定是一条或者多条指令,不然的话会出错,这个我测试过)
4) 反斜杠:反斜杠是起一个转义的作用,比如需要在标准输出中显示$则需要用反斜杠起到作用“\$“
4 变量和位置参数
以前比较熟悉的变量就是系统变量,比如HOME、PATH之类的,以前在看shell脚本的时候总会看到一些不认识的“乱七八糟“的字符,其实这就是shell脚本中的一些特殊变量。下面将这些遇到的一些东西列出来
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1..9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个指令的PID
$? 执行上一个指令的返回值
$variable 引用变量variable的值
${arr[$i]} 应用数组arr中的第$i个元素的值
当然还有很多,我只是列出了现在遇到的一些和现在能想到的。
5 控制结构和函数
Shell 编程的控制结构也同其他编程语言类似,只是格式稍有不同,循环控制的for、while、until、选择判断的if、case
For的基本结构:
For I in a b c
Do
操作语句
done
while的基本结构
while condition
do
操作语句
done
until的语法结构同while类似,只不过是执行语句的条件相反而已
if condition
then
操作语句
Elif condition
Then
操作语句
Else
操作语句
Fi
Case的语法结构
Case $var in
Mode1)操作语句;;
Mode2)操作语句;;
*)默认操作;;
Esac
在shell中函数也是非常重要的,因为可以将一些重复的操作写成函数这样可以减少很多不必要的工作,也是shell脚本更加高效地完成工作的一个特点,浪费更少的体力做更多的事(不过好像其他的语言也是这样做的,应该算不上优点),但是在练习的过程中我发现shell中的函数是不能带参数的,这个是它的一个特点
6 shell的内部命令
echo 、 eval 、 exec 、 export 、readonly 、read 、shift 、wait、(.)
各个命令的作用
Echo:将字符显示在标准输出上
Read:将外部的字符输入到标准输入中
Export:设置或者显示环境变量,由于shell本身提供了一些环境变量,但是在需要显示、添加、删除变量的时候就需要用到export,这个的作用是在以后的shell中会起到作用,而在下一次登录的时候会失效。(有点像session失效一样)
(.):点可以代替bash来使用。比如在执行test.sh的时候可以输入:. Test.sh
其他的几个命令都没有用过,等以后用了之后再加上吧。。。
7 shell的种类
ash、csh(tcsh)、ksh、bash(BourneAgain Shell)、zsh、sh(Bourneshell)
shell有很多种类,不同的种类有各自特点,从最熟悉的说起,
bash:bash是Linux系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个
sh:Bourne shell 是unix上最早使用的shell,一般在unix上应用
ksh:在工作中很多脚本都是用ksh写的,也看了其中的一些ksh的脚本,感觉跟bash在写法上虽然是类似,但是具体的还是有所不同。
Csh:csh是Linux比较大的内核,它由以WilliamJoy为代表的共计47位作者编成,共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh
Zsh:zch是Linux最大的Shell之一,由PaulFalstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的Shell的
Ash:ash Shell是由Kenneth Almquist编写的,是Linux中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便
参考资料
Shell hand bookwebsite
http://www.gnu.org/software/bash/manual/bash.html#What-is-a-shell_003f
other website about Shell programming
http://www.tldp.org/LDP/abs/html/
http://www.panix.com/~elflord/unix/bash-tute.html
Test your Shellprogramming ability website
http://bbs.chinaunix.net/thread-476260-1-1.html