- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
历史沿革
Bsh在20世纪70年代中期诞生于新泽西的 Csh在20世纪80年代早期诞生于加利福尼 AT&T贝尔实验室,具有较强的脚本编程 亚大学 ,使用C语言的语法,用户命令交 功能 互更加方便
Bsh
Csh
Ksh结合了Bsh和Csh两者的功能优势,Bash是Bsh的升级替代品,吸收了Ksh中 兼有Bsh的语法和Csh的交互特性 的诸多优秀特性,Bash是开源软件
命令行编辑键
编辑键
Ctrl+A Ctrl+E Ctrl/Alt+F Ctrl/Alt+B Ctrl+L Ctrl+N/P Ctrl+S
意义
光标移至行首 光标移至行尾 光标前移至右一字符/词末 光标后移至左一字符/词前 清屏并在屏幕顶端重显当前行 回显下一次或上一次的命令 停止输出到屏幕
Ctrl+Q
俗称壳,一种命令解释器,脚本语言
历史沿革
发展史
第一个主要的shell:Bourne shell(Steven Bourne) 在Unix第一个流行版本7中,始于1979 广发流行的,具有C风格的,易于交互式的Cshell Korn Shell 是一个交互式的命令解释器和命令编程语 言.它符合POSIX——一个操作系统的国际标准. Bash由Brian Fox在1987年创造,全称Bourne Again shell ( bash)。
SHELL基础编程
NVRSYS
基于shell脚本白盒测试案例分析
SHELL目 录
简介与历史
定义,发展沿革,特点
基础语法
特殊字符,变量,字符串替换 分支和循环,算术扩展和IO重定向
编程进阶
函数,数组,正则表达式
案例分析
tftp封装,白盒测试
shell定义
shell定义
condition: 条件测试 0 表真,非0为假 test 或 [ ] [[]] statement:
命令,执行语句
#!/bin/bash if [ -f filename ] then cat $filename else echo "$fileneame not found!" fi
条件测试
从变量$string的开头, 删除最长匹配$substring的子串
从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring}
${string/substring/repl acement} ${string//substring/rep lacement}
条件测试
字符串测试
参数 -z s1 功能 s1长度为0,为真
-n s1 s1
s1 = s2 s1 != s2
s1长度不为0,为真 s1不是空字符串,为真
s1等于s2,为真 s1不等于s2,为真
条件测试
算术测试
参数 功能
n1 –eq n2
n1 –ne n2
n1等于n2, 为真
n1不等于n2, 为真
dir=/usr/meng/ff echo $dir echo dir ls ${dir}qc/m1.c
• 变量赋值 • export , unset
dir=/usr/meng/ff echo $dir $Dir A=$B B=$C C=good
环境变量
预先定义的特殊变量
$# 参数个数 $0 $1... 参数 $? 返回值 $$ 当前进程号 $! 在后台运行的最后一个进程号 $_ 由当前shell设置的执行标志名组成的字符串 $* 命令行中给出的所有位置参数字符串 $@与S*基本相同
${string:position:length} 在$string中, 从位置$position开始提取长度$length的子串 ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring}
${string%substring}
n1 –lt n2
n1 –le n2 n1 –gt n2 n1 –ge n2
n1小于n2, 为真
Line first Line second echo "Line first"; echo "Line second" cat var3.sh | grep "echo" ...
变量
变量定义和使用
变量名=字符串
• “=”两边不能有空格
引用变量方法
• 引用变量数值
– $变量名,或${变量名}
Ksh
Bash
语言特点
1
解释型语言
SHELL
4
2 3
快速开发
继承性,交互性
易学易用
不适用场合
有跨平台移植需求(一般使用C或Java) 复杂的应用,在必须使用结构化编程的时候(需要变量 的类型检查,函数原型,等等)。 使用库或者遗留下来的旧代码的接口 代码闭源 需要I/O或socket接口,直接操作硬件 复杂算法和复杂运算的效率要求
${!varprefix*} ${!varprefix@}
匹配之前所有以varprefix开头进行声明的变量 匹配之前所有以varprefix开头进行声明的变量
字符串操作
排序文件后显示前n行
#!/bin/bash if [ $1 -z ] ;then echo "filename missing" exit else filename=$1 fi if [ $2 -z ] ;then howmany=10 else howmany=$2 fi sort -nr ${filename} | head -$howmany
特殊字符列表
7. | 8. ( )
管道
启动和停止子shell
后置应用,命令替换
9. ` 10.’或”
引用(强,弱 )
11. [ ]或[[ ]]
条件测试
12. $
变量替换
特殊符号
符号举例
#! /bin/bash # 注释,行首以#开头为注释(#!是个例外) File=demo.sh echo "Line first"; echo "Line second" cat demo.sh | grep "echo" cat $File exit 0
字符串操作
排序文件后显示前n行
#!/bin/bash filename=${1:?"filename missing."} howmany=${2:-10} sort -nr ${filename} | head -$howmany
条件测试
if/else结构语法:
if condition then statements [elif condition] then statements [else statement] fi
基础语法 特殊字符 变量 操作符 分支和循环 算术扩展 IO重定向
特殊字符
基本通配符
?任意单个字符 * 任意字符字符串 [set] 匹配set中的任意字符 [!set] 匹配不在set中的任意字符
特殊字符
举例
[a-z] 所有小写字母 [!1-9] 所有非数字 [a-zA-Z0-9_-]
字符串匹配
模式匹配举例
path=/home/root/git-hisi/makefile.a.swp echo ${path##*/} echo ${path#/*/} echo ${path:5:7} echo ${path%.*} echo ${path%%.*} makefile.a.swp root/git-hisi/makefile.a.swp /root/g /home/root/git-hisi/makefile.a /home/root/git-hisi/makefile
Ctrl+Z Alt+DEL Ctrl+W Ctrl+Y
重新开始到屏幕的输出
暂停当前命令,挂起当前任务 删除光标处至单词首内容 删除光标处左一词至词首内容 将刚删除的内容插入到光标处
字符串匹配
表达式 ${#string} ${string:position} 含义 $string的长度 在$string中, 从位置$position开始提取子串
文件测试
表达式 -e 文件名 -r 文件名 -w 文件名 -x 文件名 -f 文件名 -d 文件名 -p 文件名 -s 文件名 -t 描述字 含义 若文件存在,为真 若文件存在并且是用户可读,为真 若文件存在并且是用户可写,为真 若文件存在并且是用户可执行,为真 若文件存在并且是普通文件,为真 若文件存在并且是目录文件,为真 若文件存在并且是FIFO文件,为真 若文件存在并且不是空文件,为真 如果打开文件时其描述字是与终端设备相关的,为真
所有字母,数字,下划线和短划线
*.{a,ko,o,obj}
匹配{}中结尾的字符
特殊字符
特殊字符列表
1. # 2. ; 3. ;; 4. ~
注释,行首以#开头为注释
命令分隔符,可以用来在一行中来写多个命令
终止"case"选项
用户主目录
5. :
空命令,等价于"NOP"
6. &
后台运行命令
特殊字符
环境变量
set命令
显示迄今为止所定义的全部变量 设定位置参数值
#cat setpos echo `date` set `date` echo $2 $3 $6 echo $0 $1 $2 $3 $4 $5 $6 #sh setpos Sun Sep 28 16:48:46 CST 1997 Sep 28 1997 setpos Sun Sep 28 16:48:46 CST 1997
• “$@”表示位置参数为”f1”f2”f3”,而“$*”为“f1 f2 f3”
ห้องสมุดไป่ตู้境变量
环境变量
HOME 用户注册主目录名 cat $HOME/f1
IFS 内部字段分隔符 MAIL 用户存放信件的文件路径名 PATH 指定查找命令的路径 PATH=:/bin:/usr/bin PS1 主提示符 “$ ” PS2 次提示符 “> ” SHELL 当前shell的路径 TERM 终端的类型 ansi vt100 HZ 每秒时钟的中断次数 TZ 时区 LOGNAME 用户注册名
从变量$string的结尾, 删除最长匹配$substring的子串
使用$replacement, 来代替第一个匹配的$substring 使用$replacement, 代替所有匹配的$substring
${string/#substring/rep 如果$string的前缀匹配$substring, 那么就用$replacement lacement} 来代替匹配到的$substring ${string/%substring/re placement} 如果$string的后缀匹配$substring, 那么就用$replacement 来代替匹配到的$substring
字符串操作
表达式 ${var} ${var-DEFAULT} ${var:-DEFAULT} ${var=DEFAULT} 含义 变量var的值, 与$var相同 如果var没有被声明, 那么就返回$DEFAULT作为其值 如果var没有被声明, 或值为空, 那么就返回$DEFAULT作为其值 如果var没有被声明, 那么就以$DEFAULT作为其值
${var:=DEFAULT} 如果var没有被声明, 或值为空, 那么就以$DEFAULT作为其值
${var+OTHER}
${var:+OTHER}
如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG
环境变量
设置数值运算
set的/a参数就是让SET可以支持数学符号进行加减等一 些数学运算! 支持的数学运算包含(优先权递减): () 分组 !~一元运算符 */% 算数运算符 +算数运算符 << >> 逻辑移位 & 按位“与” ^ 按位“异” | 按位“或” = *= /= %= += -= 赋值 &= ^= |= <<= >>= , 表达式分隔符 用法示例:set /a num=2*10,这样变量num的值将变为:20