




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、曙光信息产业股份有限公司 Shell程序设计提纲1. Shell简介2. Bash编程基础3. 常用字符处理工具介绍 什么是Shell?1. 命令解释器2. 程序设计语言 脚本(Scripting) hardwareKernel ShellApplications为什么要学习Shell?nShell是Linux的用户接口n简单易用的命令组合完成复杂任务n强大的综合处理功能n一生受用好工具n.Shell有哪些种类?n当前系统安装的Shell可以通过 cat /etc/shells 查看n用户的默认登录Shell可以通过 cat /etc/passwd 查看n/bin/csh (c-like sh
2、ell) n/bin/ksh (kornshell, by AT&T Bell LAB) n/bin/tcsh (enhanced csh, FreeBSD default login shell) n/bin/bash (bourne-again shell) n/bin/dashn.提纲1. Shell简介2. Bash编程基础3. 常用字符处理工具介绍Bash Shell发展历史:AT & T 设计Unix 时设计了Bourne Shell;Bash: Bourne Again Shell, GNU Project大多数Linux发行版的默认Shell;Bash的内部命令Bash集成了一
3、些内部命令,组成基本操作环境常用的内部命令::(true) .(source) alias bg bind builtin cd declare dirs disown echo enable eval exec exit export fc fg getopts hash help history jobs kill let local logout popd pushd pwd read readonly return set shift stop suspend test times trap typest ultimit umask unalias unset wait循环分支控制相关
4、:if else elif fi for do done case while until continue break Bash的初始化脚本通常在这些脚本中进行自定义设置,比如一些程序的环境变量等/etc/profile/etc/bashrc/.bash profile/.bash login/.bashrc/.profileBash的执行方式(交互式)Linux终端登录后,即进入交互式的执行环境可以执行内部及外部命令foolocalhost lsa.txt b.txt c.txtfoolocalhost hostnamelocalhost后台执行: command &foolocalhos
5、t sleep 300 &Bash的执行方式(脚本方式)脚本执行方式,将Bash语句写在文本文件中,批量执行#开头表示注释不开启子Shell,在当前Shell中运行:foolocalhost source test.shfoolocalhost . test.shfoolocalhost eval cat test.sh在新的子Shell中运行:foolocalhost bash -c commandsfoolocalhost bash test.shfoolocalhost ./test.sh(脚本文件以#!/bin/bash开头,且具有可执行权限)Bash命令的组合方式不同的命令可分行放置
6、,也可以用分号隔开#!/bin/bashcd subdir1rm a.txtfoolocalhost cd /home/foo/subdir2; rm b.txtBash命令的组合方式(逻辑组合)管道线分隔符command1 & command2 (前者执行成功才执行后者)command1 | command2 (前者执行失败才执行后者)foolocalhost cd /home/foo & rm b.txtfoolocalhost cd /home/foo | echo dir does not exist!Bash命令的组合方式(命令集合)命令集合 commands; 命令集合,在当前Sh
7、ell执行,注意前后的空格和分号(commands) 开启新的子Shell执行foolocalhost cd /home/foo; rm a.txt; foolocalhost (cd /home/foo; rm a.txt)Bash的别名设置(alias)可以定义一些命令的别名,方便使用,别名设置可以放在Bash的初始化脚本中自动加载foolocalhost alias ll=ls -l -color=ttyfoolocalhost alias llalias ll=ls -l -color=ttyfoolocalhost alias rm=rm -ifoolocalhost unalias
8、 ll取消别名Bash的变量变量申明、查看、清除var=value #注意=号前后无空格echo $varunset varfoolocalhost var1=abcfoolocalhost echo $var1abcfoolocalhost unset var1foolocalhost echo $var1(无输出)Bash的变量(系统变量)常用系统变量:HOSTNAMETERMPATHHOMEPWDSHELL.foolocalhost echo $SHELL/bin/bashfoolocalhost echo $HOME/home/fooBash的变量(全局变量)全局变量(子Shell会继
9、承)export var=valuefoolocalhost export var1=abcfoolocalhost var2=123foolocalhost export var2foolocalhost bash -c echo $var1 $var2abc 123Bash的变量(特殊变量)$?前一个命令的退出状态,正常退出返回0,异常退出返回非0值$#脚本或函数位置参数的个数$0脚本或函数的名称$1, $2, .传递给脚本或函数的位置参数$*以”$1 $2.”的形式保存所有输入的命令行参数$以“$1”“$2”.的形式保存所有输入的命令行参数foolocalhost cat test.sh
10、#!/bin/bashecho The command is $0 $1 $2foolocalhost ./test.sh arg1 arg2The command is test.sh arg1 arg2Bash的变量(特殊变量)foolocalhost lsa.txt b.txtfoolocalhost echo $?0foolocalhost ls c.txtls: cannot access c.txt: No such file or directoryfoolocalhost echo $?2Bash的通配符通配符* 配任何字符串,包括空字符串? 匹配任何单个字符 按照字符范围或列
11、表匹配.,. 按照字符串列表匹配 转意符,使元字符失去其特殊的含义foolocalhost ls *.txtfoolocalhost ls A0?.txtfoolocalhost ls A-Z,a-z0-9.txtfoolocalhost ls !a-z*.txtfoolocalhost ls abc.txt,tar,datfoolocalhost echo *Bash的命令替换命令替换:把命令的输出结果字符串直接替换进来commands 注意是反引号,不是单引号$(commands)foolocalhost echo dateSun Jan 9 15:38:00 2011foolocalho
12、st files=lsfoolocalhost currentdir=$(pwd)Bash的变量参数替换foolocalhost echo $username无输出foolocalhost echo $username-whoamifoofoolocalhost echo $username无输出$variable-default如果变量没有定义,则返回默认值注意: 变量定义成空字符串也算定义Bash的变量参数替换(续1)foolocalhost echo $username无输出foolocalhost echo $username=whoamifoofoolocalhost echo $u
13、sernamefoo$variable=default如果变量没有定义,返回默认值,且赋值给变量Bash的变量参数替换(续2)$variable+value如果变量已经定义,返回+号后给定值,如果没有,返回空$variable?msg如果变量已经定义,返回变量本身,如果没有,打印给定msgBash的变量字符串操作(子串提取)foolocalhost string=01234foolocalhost echo $#string5foolocalhost echo $string:2234foolocalhost echo $string:2:223$#string返回字符串的长度$string:
14、position提取从指定位置开始的子串$string:position:length 提取从指定位置开始的定长子串Bash的变量字符串操作(子串剪裁)foolocalhost string=abc.txtfoolocalhost echo $string#abc.txtfoolocalhost echo $string%.*abc$string#substring裁去从左边最短匹配子串$string#substring裁去从左边最长匹配子串$string%substring裁去从右边最短匹配子串$string%substring裁去从右边最长匹配子串如果子串不匹配,不做裁剪操作Bash的变量
15、字符串操作(子串替换)foolocalhost string=black-blackfoolocalhost echo $string/black/whitewhite-blackfoolocalhost echo $string/black/whitewhite-white$string/substring/replace替换第一处匹配$string/substring/replace替换所有匹配如果子串不匹配,不做裁剪操作Bash的变量数组(Array)赋值:array0=value1array1=value2.或者一次性赋值:array=(value1 value2 .)元素引用:$#a
16、rray* 变量元素个数$array0某个变量值$array*全部变量值foolocalhost array=(dog fish cat)foolocalhost echo $#array*3foolocalhost echo $array*dog fish catfoolocalhost echo $array0dogBash的终端控制(输入输出重定向)Linux 默认的三个I/O 通道:stdin(标准输入,文件描述符:0) 默认是键盘stdout(标准输出,文件描述符:1) 默认是终端stderr(标准错误,文件描述符:2) 默认是终端重定向stdout到文件(新建或覆盖)重定向stdo
17、ut到文件(追加)2重定向stderr到文件(新建或覆盖)2重定向stderr到文件(追加)2&1 重定向stderr到stdout&重定向stdout和stderr到文件Bash的终端控制(输出重定向)foolocalhost ls *.txt,datls: cannot access *.txt: No such file or directorya.dat b.datfoolocalhost ls *.txt,dat /tmp/ls.outls: cannot access *.txt: No such file or directoryfoolocalhost cat /tmp/ls.
18、outa.dat b.datfoolocalhost ls *.txt,dat /tmp/ls.out 2/tmp/err.outfoolocalhost cat /tmp/err.outls: cannot access *.txt: No such file or directoryBash的终端控制(输入重定向)命令的输入定向到文件,而不是从键盘输入foolocalhost tr a-z A-Z tr a-z A-Z result.logBash的终端控制(重定向到特殊文件)可以重定向到特殊字符设备文件e.g.foolocalhost ls result.log 2/dev/null注:
19、Linux下常用的特殊字符设备文件:/dev/null “空文件”或“黑洞文件”,丢弃一切写入的内容/dev/zero 永远提供NULL空字符Bash的终端控制(管道符)管道符pipe(|),将命令的输出定向到下一条命令的输入foolocalhost ls /usr/lib | lessfoolocalhost cut -f1 -d: /etc/passwd | sort -r | lessfoolocalhost cut -f1 -d: /etc/passwd | sort -r result.logBash读入变量(read)使用内部命令read,可以从终端读入Shell变量与C语言的sc
20、anf()类似格式:read -p 提示字符 var1 var2foolocalhost cat read_test.sh#!/bin/bashread name ageecho $name is $age years old.foolocalhost ./read_test.sh输入Bob 17,按Ctrl-dBob is 17 years old.foolocalhost echo Bob 17 | ./read_test.shBob is 17 years old.Bash中的引号单引号屏蔽所有特殊字符foolocalhost echo $HOME$HOMEfoolocalhost ec
21、ho $HOME/home/foofoolocalhost echo $HOME /home/foofoolocalhost echo $HOME /home/fooBash中的数学运算(内部命令)内置命名 let let 或 (.)(.),只能用于整型运算foolocalhost echo $( (1+1)*(2*2) )8foolocalhost a=1foolocalhost (a+=1)foolocalhost echo $a2foolocalhost a=1foolocalhost let a+=1foolocalhost echo $a2Bash中的数学运算(外部命令)调用外部命令
22、exprexpr,只能用于整型运算foolocalhost expr ( 1 + 1 ) * (2 * 2 )8foolocalhost a=expr 1 + 1foolocalhost echo $a2注意括号和运算符前后有空格Bash中的数学运算(外部命令)调用外部命令bcbc,可用于浮点运算,功能强大foolocalhost echo 1.2*1.2 | bc -l 1.44foolocalhost echo ibase=10; obase=2; 10 | bc1010Bash中的逻辑判断内部命令testtest,可用于数字比较、字符串比较、文件状态检查、逻辑判断等。语法:test co
23、nditiontest condition或 condition # condition #注意 前后的空格如果conditioncondition成立,返回0 0,不成立返回非0 0foolocalhost test 1 = 1; echo $?0foolocalhost 1 = 2 ; echo $?1Bash中的逻辑判断(字符串比较)= =或=两个字符串相等!=!=两个字符串不等-z-z空字符串-n-n非空字符串=与正则表达式regexregex进行比较foolocalhost str=abcfoolocalhost $str = abc & echo truetruefoolocalh
24、ost -z $str & echo true无输出Bash中的逻辑判断(整数比较)-eq-eq或=两个整数相等-ne-ne或!=!=两个整数不等-gt-gt或 前者大于后者-ge-ge或=前者大于等于后者-lt-lt或 前者小于后者-le-le或= var=1foolocalhost $var = 1 & echo truetruefoolocalhost $var file=/etc/hostsfoolocalhost -r $file & echo read permission OKread permission OKBash中的逻辑判断(逻辑操作符)condition1 condit
25、ion1 -a-a condition2 condition2逻辑与condition1 condition1 -o -o condition2condition2逻辑或! ! condition condition逻辑取非foolocalhost a=2; b=3foolocalhost $a 1 -a $b 1 & echo truetruefoolocalhost ! $a 1 & echo true无输出Bash中的分支判断(if语句)if condition_judgementthen.fiif condition_judgementthen.else.fiif condition_
26、judgement1then.elif condition_judgement2then. else.fiBash中的分支判断(if语句)#!/bin/bashif $1 1 then echo Greater than 1elif $1 /dev/nullthen echo “Entering dir succeedsfi举例:条件判断也可以是命令,执行成功表示真Bash中的分支判断(case语句)case expression inpattern1) .;pattern2).;.patternn).;esaccase expression inpattern1) .;pattern2).;
27、.patternn).;*).;esacBash中的分支判断(case语句)#!/bin/bashcase $1 inapple)echo You choose apple;grape)echo You choose grape;*)echo “I have only apple and grape;esac举例:Bash中的循环控制(for循环)for var in value_listdo.donefor (var=0; var=10; var+)do.doneBash中的循环控制(for循环)for name in tom bob cindydoecho $namedonefor (i=
28、0; i=10; i+)doecho $idone举例:for i in seq 1 10dossh node$i datedone变量取值也可以来自其它命令的输出Bash中的循环控制(while循环)while condition_judgementdo.done条件判断可以是:ntest test 或 . . 语句n其它命令,判断其执行成功与否ntruetrue 或 : : (Bash (Bash的内部命令,代表真,使得whilewhile成为无限循环) )Bash中的循环控制(while循环)COUNTER=0# If COUNTER 5, program will print the
29、value of it.while $COUNTER 5 doCOUNTER=$(COUNTER+1)echo $COUNTERdone举例一:Bash中的循环控制(while循环)NUMBER=0while $NUMBER != 9 ; doread -p Enter a integer, 9 to exit NUMBERecho You typed is $NUMBERdone举例二:不停地从终端读入一个整数,输入9 9则退出Bash中的循环控制(while循环)while read LINEdoecho $LINE | sed -e s/node/blade/ done /dev/nul
30、lthenbreakfidone举例四:无限循环及跳出break语句用于跳出循环break ,可以跳出多重循环Bash中的循环控制(until循环)until condition_judgementdo.done与while循环语法一致,但意思“相反”,没有while循环常用until循环是先执行循环,直到满足判断条件后跳出Bash中的函数在Shell 中,函数就是一组实现一定功能的命令集合;函数由两部分组成:函数名(在一个脚本中必须唯一);函数体(命令集合);function_name().#先定义,后使用function_nameBash中的函数(函数参数)swap_filename()f
31、ile1=$1file2=$2cp $file1 file1.bakmv $file2 $file1mv $file1.bak $file2与Bash脚本的位置参数一样,函数的位置参数也用$1, $2, .表示举例:交换两个文件的文件名Bash中的函数(函数的退出状态)check_file_lines()file=$1lines=wc -l $file if $lines -gt 1000 ; thenreturn 0elsereturn -1 ficheck_file_lines result.log & echo file is long enough 函数结尾可以掉用return语句返回
32、执行状态,0表示无错误举例:提纲1. Shell简介2. Bash编程基础3. 常用字符处理工具介绍正则表达式regex正则表达式:进行精确文字匹配的句法规则;比通配符强大无数倍.匹配任意单个字符*一个单字符后紧跟*,表示匹配该字符0次或任意多次匹配行首$匹配行尾匹配序列中的任何一个,比如abc123、a-z0-9.匹配非序列中的字符转意特殊字符patternn匹配规则重复n次patternn,匹配规则重复至少n次patternn,m匹配规则重复至少n次,至多m次Regex的基本元字符集:正则表达式regex(续1)The匹配行首的The.*匹配任意字符或字符串$匹配空行.*$匹配任意行A0-
33、9.txt匹配A0.txt,A1.txt,.,A9.txt0-9a-zA-Z匹配非数字或字母的字符(0-91,3.)30-91,3匹配IPv4的IP地址Regex举例:+一个单字符后紧跟+,表示匹配该字符1次或任意多次?一个单字符后紧跟?,表示匹配该字符0次或1次(patterns)匹配规则组合Regex的扩展元字符集:字符查找工具grepgrep 是 Linux 下使用最广泛的命令之一,其作用是在一个或多个文件中查找某个字符模式所在的行,并将结果输出到屏幕上 grep 以行为单位进行处理,不会对输入文件本身进行修改q grep 家族由 grep、egrep 和 fgrep 组成:u grep
34、: 标准 grep 命令,本文主要讨论此命令。u egrep: 扩展 grep,支持基本及扩展的正则表达式。u fgrep: 固定 grep (fixed grep),按字面解释所有的字符,即正则表达式中的元字符不会被特殊处理。字符查找工具grep(续1)q grep 命令的一般形式:grep 选项 pattern file1 file2 .grep -f patternfile file1 file2 .l pattern:可以是正则表达式(用单引号括起来)、 或字符串(加双引号)、或一个单词。l file1 file2 . :文件名列表,作为 grep 命令的输入;grep 的输入也可以来
35、自标准输入或管道;q 可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令字符查找工具grep (续2)-c只输出匹配的行的总数-i不区分大小写-h查询多个文件时,不显示文件名-l查询多个文件时,只输出包含匹配模式的文件的文件名-n显示匹配的行及行号-v反向查找,即只显示不包含匹配模式的行-s不显示错误信息grep -i an* datafilegrep 常用选项字符查找工具grep(举例)查找包含字符串Hello的行grep Hello datafile查找以#开头的行grep # datafile查找非空行并另存grep -v $ dataf
36、ile datefile2与管道符连用cat /etc/hosts | grep node | wc -l 字符流编辑工具sedsed 是一个精简的、非交互式的编辑器q sed 是什么q sed 如何工作sed 逐行处理文件(或输入),并将输出结果发送到屏幕。即:sed 从输入(可以是文件或其它标准输入)中读取一行,将之拷贝到一个编辑缓冲区,按指定的 sed 编辑命令进行处理,编辑完后将其发送到屏幕上,然后把这行从编辑缓冲区中删除,读取下面一行。重复此过程直到全部处理结束。sed 只是对文件在内存中的副本进行操作,所以 sed 不会修改输入文件的内容。sed 总是输出到标准输出,可以使用重定向
37、将 sed 的输出保存到文件中。字符流编辑工具sed(续1)u sed的命令行调用方式sed -n-e sed_cmd input_filel -n:缺省情况下,sed 在将下一行读入缓冲区之前,自动输出行缓冲区中的内容。此选项可以关闭自动输出。l -e:允许调用多条 sed 命令,如:sed -e sed_cmd1 -e sed_cmd2 input_filel sed_cmd:使用格式: addresssed_edit_cmd (通常用单引号括起来),其中 address 为 sed 的行定位模式,用于指定将要被 sed 编辑的行。如果省略,sed 将编辑所有的行。sed_edit_cmd 为 sed 对被编辑行将要进行的编辑操作。l input_file:sed 编辑的文件列表,若省略,sed 将从标准输入(重定向或管道)中读取输入。字符流编辑工具sed (续2)sed 选项 -f sed_script_file
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 材料定样管理办法
- 林业绩效管理办法
- 救助管理办法广州
- 择优项目管理办法
- 2024年四川省小金县急诊医学(副高)考试题含答案
- 2024年四川省天全县急诊医学(副高)考试题含答案
- 曲阳供热管理办法
- 拍照留痕管理办法
- 新疆水库管理办法
- 旅游签证管理办法
- 专科重点病人管理制度
- 混合动力系统在船舶中的应用
- 光伏发电监理表式(NB32042版-2018)
- 统编版语文三年级上册第一单元大单元整体教学设计
- 陕西省全过程工程咨询服务清单
- 2024年商业租房合同格式版(四篇)
- 2023年河北省高考语文真题及参考答案
- 吨桶使用管理制度
- 高速公路清障救援安全培训-汤立 2
- 校企深度融合构建协同育人长效机制(鲁嘉华副校长)
- 2014版河南中安qd6330点型气体探测器使用说明书
评论
0/150
提交评论