1.python 皮冻 perl php
2.shell的作用是解释执行用户的命令,(交互式)
3.UNIX系统上的很多种shell:
(1).sh(bourne shell) : 由Steve Bourne开发,各种UNIX系统都配有sh
(2).csh(C shell): 由Bill joy开发,随BSD UNIX 发布,它的流程控制语句很像C语言,支持很多Bource Shell所不支持的功能 : 作业控制,命令历史,命令行编辑
(3). ksh(Korn shell) : 由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能
(4).tcsh(TENEX C shell): 是csh的加强版本, 引入了命令补全等功能,在FreeBSD, Mac, OS X等系统上替代了csh
(5).bash : 由GNU开发的shell,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容。
bash和sh的不同 :一方面, bash扩展了一些命令和参数,另一方面bash并不完全兼容sh, 所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,bash可以假装自己是sh,不认扩展的命令,并且行为和sh保持一致。
4.shell执行交互式命令。
一般情况下shell会fork并exec该命令。
内建命令除外,执行内建命令时相当于shell进程中的一个函数的调用,并不创建新的进程,例如:cd,alias , umask, exit
小提示 :凡是which命令查不到程序文件所在位置的命令都是内建命令。 查看内建命令应该 :man bash-builtins
5.shell脚本中使用#表示注释。但如果#位于第一行开头,并且是#!则例外 :表示该脚本使用后面指定的解释器解释执行
6. 对于命令 : 手动输入时,,内建是内建,普通是普通
写成脚本之后,内建变普通
写成脚本之后,使用source或'.'执行脚本,内建是内建,普通是普通
7.命令行下输入命令用()括起来,会fork出一个子进程,多个命令使用 ";"隔开
8.shell变量由全大写字母加下划线组成,由两种类型的shell变量:
环境变量 : 可以从父进程传到子进程,可以使用printenv命令显示当前shell进程的环境变量
本地变量 : 只存在于当前shell进程,用set命令可以显示当前shell进程中定义的所有变量(本地变量和环境变量)和函数
9.shell中定义和赋值一个变量: VNRNAME=value :注意等号两边都不能有空格,否则会被shell解释成命令和命令行参数。
一个变量定义后仅存在于当前shell进程,是本地变量,可以使用export命令把本地变量导出为环境变量。
使用unset命令可以删除已定义的环境变量或本地变量
10. 如果一个变量叫VARNAME,用${VARNAME}可以表示它的值,在不引起歧义的情况下可以用$VARNAME表示它的值
11.通配符(wildcard):? []
* | 匹配0个或多个任意字符 |
? | 匹配一个任意一个字符 |
[若干字符] | 匹配方括号中任意一个字符的一次出现 |
12.命令代换:
由反引号括起来的也是一条命令,shell先执行该命令,然后将输出结果立刻代换到当前命令行中
1 cxw@cxw-Lenovo-G470:~/Dropbox/CXW/New/9_24_shell_jiaoben$ DATE=`date` 2 cxw@cxw-Lenovo-G470:~/Dropbox/CXW/New/9_24_shell_jiaoben$ echo ${DATE} 3 2013年 09月 25日 星期三 15:25:43 CST 4 cxw@cxw-Lenovo-G470:~/Dropbox/CXW/New/9_24_shell_jiaoben$ DATE=$(date) 5 cxw@cxw-Lenovo-G470:~/Dropbox/CXW/New/9_24_shell_jiaoben$ echo ${DATE} 6 2013年 09月 25日 星期三 15:26:31 CST 7 cxw@cxw-Lenovo-G470:~/Dropbox/CXW/New/9_24_shell_jiaoben$
13.算术运算 :$(()) 中的shell变量取值将转换成整数
只能用于+-*/和()运算符,并且只能用于整数运算
提示 : ()运算符是函数调用运算符
14.转义字符\
创建以-开头的文件名。 : touch ./-hello 和 touch -- -hello
另一种用法, \表示续行
15.shell脚本中的单引号和双引号一样都是字符串的界定符,但字符串中不能出现单引号,如果么有引号输入回车,会给出续行提示符,要求用户配对单引号。
单引号和双引号 :用于保持引号内所有字符的字面值(\和回车也不例外)
对于双引号来说 :以下情况除外 :
反引号仍表示命令替换
\$表示$的字面值
\`表示`的字面值
\"表示“的字面值
\\表示\的字面值
除以上情况之外,在其他字符面前的\无特殊含义,之表示字面值
16.启动脚本 :作为交互登录shell启动,或者使用--login参数启动
启动bash会自动执行以下脚本 :
1.首先执行/etc/profile,系统中每个用户登录时都要执行这个脚本。
如果系统管理员希望某个设置对所有用户都有效,可以写在这个脚本里
2.然后一次查找当前用户主目录下的~/.bash_profile,~/.bash_login和~/.profile三个文件,找到第一个存在并且可读的文件来执行,
如果希望某个设置只对当前用户生效,可以写在这个脚本里,由于这个脚本在/etc/profile之后执行,。当前用户的设置会覆盖系统中全局的设置。
~/.profile这个启动脚本是sh规定的,bash规定首先查找以~/.bash_开头的启动脚本,如果么有则执行~/.profile,是为了和sh保持一致
3,在退出登录时会执行~/.bash_logout脚本(如果它存在的话)
17.以交互非登录shell启动
比如在图形界面开一个终端窗口,或者在登录shell提示符下再输入bash命令,就得到一个交互非登录的shell,这种shell在启动时自动执行~/.bashrc脚本
为了使登录shell也能自动执行~/.bashrc,通常坐在~/.bash_profile中调用~/.bashrc
18.shell脚本的语法:
条件测试:test[
返回状态 :结果为真,返回0, 结果为假,返回1
[-d DIR] | 如果DIR存在并且是一个目录则为真 |
[-f FILE] | 如果FILE存在且是一个普通文件则为真 |
[-z STRING] | 如果STRING的长度为零则为真 |
[-n STRING] | 如果STRING的长度为非零则为真 |
[STRING1=STRING2] | 如果两个字符串相同则为真 |
[STRING1 != STRING2] | 如果两个字符串不相同则为真 |
[ARG1 OP ARG2] | ARG1和ARG2应该是整数或者取值为整数的变量, |
上面的OP | -eq(等于),-ne(不等于),-lt(小于), -le(小于等于), -gt(大于), -ge(大于等于)其中的一个 |
测试条件之间还可以做与,或,非逻辑运算
[! EXPR] | EXPR可以是上表中的任意一种测试条件,!表示逻辑反 |
[EXPR1 -a EXPR2] | EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与 |
[EXPR1 -o EXPR2] | EXPR2和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或 |
19.如果$VAR变量事先没有定义,则被Shell展开为空字符串
20. : 是一个特殊命令,称为空命令,该命令不做任何事
&&相当于if...then... ||相当于ifnot...then... &&和||用于链接两个命令,而上面的-a和-o用于在测试表达式中链接两个测试条件
if的结尾是fi case的结尾是esac ;;表示break
$1表示参数列表的第一个参数
for ...in ...;do
.......
done
末尾有~的文件表示临时文件
while [...]; do
.....
done
21。常用的位置参数和特殊变量
$0 | 相当于c语言main函数的argv[0] |
$1 $2 ..... |
称为位置参数, 相当于C语言main函数的argv[1],argv[2] |
$# | 相当于C语言main函数argc - 1 |
$@ | 表示参数列表“$1‘"$2"... |
$? | 上一条命令的Exit Status |
$$ | 当前shell的进程号 |
shift命令左移 不带参数的shift表示shift 1
22.函数,
23. shell脚本的调试方法
-n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
使用这些选项的三种方法,
1.在命令行提供参数,
2.在脚本的开头提供
3.在脚本中用set命令启用或禁用参数