1.对shell的认识
shell是linux中一个重要的层次,他是用户与系统交互作用的界面。最常见的使用方式:在介绍linux命令时,shell都是作为命令解释程序出现:他接收用户打入的命令,进行分析,创建子进程实现命令所规定的的功能,等子进程终止工作后,发出提示符。
shell除了作为命令结束程序以外,还是一种高级程序设计语言,他有不变量,关键字,有各种控制语句,如if,case,while,for等语句,有自己的语法结构。利用shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的linux命令有机的组合在一起,可以大大提高编程的效率,充分利用linux系统的开放性能,设计出适合自己要求的命令。
由于历史原因,Unix系统上有许多种shell,在linux下,最常用的一种是bash:
2.执行脚本
编写一个简单的脚本shell.sh
#!/bin/bash
date
echo "helloworld"
echo
echo "we are BSP2208 class"
echo
/bin/pwd
echo
echo "this is shell脚本"
/bin/ls
执行方法有三种:
1》./shell.sh
2》. shell.sh
3》source shell.sh
4》特例:用bash程序直接执行文件时,不需要脚本文件有可执行权限
/bin/bash ./shell.sh
如果将命令行下输入的命令用括号括起来,那么一会fork出一个子shell执行小括号中的命令,一行中可以输入由分号隔开多个命令
(cd ..; ls -l) //不会改变工作目录 与不带括号 cd ..; ls -l 执行结果一样
3.shell语法
数据类型只有字符串Shell 变量名通常是以字母或下划线打头的字母、数字和下划线字符序列,并且大小写字母意义不同。
有两种类型的Shell变量:环境变量和临时变量
环境变量:可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork出来的子进 程。用printenv命令可以显示当前Shell进程的环境变量。 与env查看环境变量一致
临时变量:只存在于当前Shell 进程,用set命令可以显示当前Shell进程中定义的所有变量(包括临时变量和环境变 量)和函数。
注意:等号两边不能有空格,否则会被shell解释成命令和命令行参数
5,文件名代换
这些用于匹配的字符称为通配符,如:*?[ ] 具体如下:
*:匹配0个或多个任意字符
?:匹配一个任意字符
[若干字符]:匹配方括号中任意一个字符的次出现一次的文件名
命令代换也可以用 $()表示 命令:DATE=$(date) (例程见上图)
7.算数代换
使用$(()),用于算数计算,(())中的shell变量取值将转换成整数,同样含义的$[ ]等价:
例如: echo $(($var+3)) 等价于$((var+3))或$[var+3]
例如:echo \$PATH 或者 echo \\
创建文件 --test
touch --test //报错
因为各种Unix命令都把-号开头的命令行参数当做命令的选项,而不会当做文件名,如果非要处理以-号开头的文件名,可以两种方法
touch -- --test 或者touch ./--test
8.单引号
Shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内 所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对 就输入回车,Shell 会给出续行提示符,要求用户把引号配上对。例如:
echo "abcde"
echo 'abcde'
9.双引号
被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。单引号不能展开变量。
10.条件测试
user02$ VAR=2user02$ test $VAR -gt 1user02$ echo $?
和C语言类似,测试条件之间还可以做与、或、非逻辑运算:
例程:
11.分支
if/then/elif/fi和C语言类似,在Shell中用if、then、elif、 else、 fi 这几条命令实现分支控制。这种流程控制语句本质 上也是由若干条Shell命令组成的
#! /bin/bash
if [ -f shell.sh ];then
./shell.sh
echo "shell.sh is a file and exsit"
else
echo "shell.sh is not exsit"
fi