1. 为什么使用shell编程
使用shell进行程序设计的原因之一是,你可以快速、简单地完成编程。而且,即使是最基本的Linux安装也会提供一个shell。
虽然shell表面上和Windows的命令提示符相似,但是它具备更强大的功能以完成相当复杂的程序。你不仅可以通过它执行命令、调用Linux工具,还可以自己编写程序。shell执行shell程序,这些程序通常被称为脚本,它们是在运行时解释执行的。
2. Linux/UNIX哲学
它们非常依赖于代码的高度可重用性。
3.重定向输出
例如 $ ls –l > lsoutput.txt
该命令把数据输出到文件中,且是先清空文件内容再写入
$ ps >> lsoutput.txt
则是把ps命令的输出附加到指定文件的尾部
‘>’是把标准输出重定向,而‘2>’是把标准错误输出重定向
可以把错误信息重定向到null设备中,即不显示错误信息,如下:
cat ~/notexistfile 2 > /dev/null
4.管道
需要注意的是:如果你有一系列的命令需要执行,相应的的输出文件是在这一组命令被创建的同时立刻被创建或写入的,所以绝不要在命令流中重复使用相同的文件名。如果尝试执行如下命令:
$ cat mydata.txt | sort | uniq > mydata.txt
你最终将得到一个空文件,因为你在读取文件mydata.txt之前就已经覆盖了这个文件的内容。
5.shell语法
5.1变量
在shell里,使用变量之前不用做出声明,可以通过使用它们来创建它们。在shell中通过在变量名前加一个$来引用他们的内容。
注意,如果变量内容包含空格,则在赋值时要把字符串用双引号把它们括起来,但使用read命令为变量赋值时不用加双引号,如下:
$ salutation=”Hello world”
$ echo $salutation
Hello world
$ read salutation
Hello kitty
$ echo $salutation
Hello kitty
5.1.1 引号的使用
当把 $变量表达式放在“”中,程序执行到这一行时就会把变量替换为它的值;如果放在‘’中,就不会发生替换,还可以在$变量前面添一个转义字符\来防止替换
5.1.2 环境变量
环境变量 说明 $HOME 当前用户的家目录 $PATH 以冒号分隔的用来搜索命令的目录列表 $PS1 命令提示符,通常是$字符,但在bash中可以使用更复杂的值 $PS2 二级提示符,通常是 > 字符 $IFS 输入域分隔符。当shell读取输入时,它给出用来分隔单词的一组字符,通常是空格、制表符和换行符 $0 shell脚本的名字 $# 传递给脚本的参数个数 $$ shell脚本的进程号,脚本程序通常会用它生成一个唯一的临时文件,例如/tmp/tmpfile_$$
5.1.3参数变量
参数变量 说明 $1, $2, … 脚本程序的参数 $* 在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFS被修改了,那么$*将命令行分割为参数的方式将随之改变 $@ 它是$*的一种精巧的变体,它不使用IFS环境变量,所以即使IFS为空,参数也不会挤在一起
6.条件
6.1 test和[命令
例如if test –f fred.c 等价于 if [ –f fred.c ]
条件测试
if [ ]
then ***
elif [ ]
then ***
else
***
fi
6.2 for语句
for variable in values
do
statements
done
6.3 while语句
while condition do
statements
done
6.4 until语句
until condition
do
statements
done
6.5 case 语句
case variable in
pattern [ | pattern] … ) Statements ;;
pattern [ | pattern] … ) Statements ;;
esac
statement1 && statement2 如果语句1执行成功,才会执行语句2
statement1 || statement2 如果语句1执行失败,才会执行语句2
7. 函数
定义一个函数非常简单:
function_name () {
statements
}