LinuxShell脚本编写基础NetentSecQA功能组Page2LinuxShell脚本编写基础◆第一章Shell简介◆第四章控制流结构◆第三章shell输入与输出◆第二章变量和运算符◆第五章文本过滤Page3第一章Shell简介Page4LinuxShell脚本编写基础-第一章shell简介◆什么是shell◆Shell脚本的开头◆怎样执行shell脚本◆简单例子Page5LinuxShell脚本编写基础-第一章shell简介Shell是核心程序(kernel)之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。操作系统与Shell-输入指令(命令)-解释器解释指令-调用操作系统系统调用,获得结果-解释器将结果返回给用户(命令)操作系统上的Shell-MSDOS:command.com-Windowsxp(2000):cmd-Linux:ash,csh,BashPage6LinuxShell脚本编写基础-第一章shell简介Shell的类型ash、bash、ksh、csh等--cat/etc/shellscat/etc/shells#得到系统中有哪些shell--echo$SHELLecho$SHELL#得到系统目前运行在哪个shell下使用shell的原因:-Shell是用户与操作系统之间的接口,是交互式的-预先重复的指令可以保存在文件中-可以编程,使得程序流程自动化-长期使用的指令可以流程化、自动化-组合、编辑指令,构建自己的新指令-脚本是编程语言,变量、语句和函数能够处理更复杂的任务Page7LinuxShell脚本编写基础-第一章shell简介开头程序必须以下面的行开始(必须放在文件的第一行):#!/bin/bash#!/bin/bash符号#!用来告诉系统它后面的参数是用来执行该文件的程序。例子中我们使用/bin/bash来执行程序。注释在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用以及工作原理。Page8LinuxShell脚本编写基础-第一章shell简介例子(使用编辑器vi创建一个脚本)#!/bin/bash#!/bin/bash##helloworld.shhelloworld.sh#printHelloworld#printHelloworlda=helloworlda=helloworldecho${a}echo${a}执行helloworld.sh##增加执行权限增加执行权限chmodchmod+x+xhelloworld.shhelloworld.sh##执行脚本执行脚本././helloworld.shhelloworld.shPage9LinuxShell脚本编写基础-第一章shell简介顺序执行Command1;command2;command3…检查执行Comman1&&command2Command1执行成功后执行command2cpabcdef&&echodef&&echo““copyisokcopyisok””Command1||command2Command1执行失败后执行command2touch/etc/touch/etc/tests.conftests.conf||exit||exit命令组合(command1;command2)((lslscd&&ll)&&(echocd&&ll)&&(echook!)ok!)当前shell执行或在子shell执行Page10LinuxShell脚本编写基础-第一章shell简介简单调试-在脚本中增加echo语句-在脚本中增加read语句复杂调试-Shell提供的特殊参数--v当输入行读入时打印--x显示扩展命令和参数的值Page11LinuxShell脚本编写基础-第一章shell简介课后作业-自己尝试编写一个脚本,并运行。Page12第二章变量和运算符Page13第二章变量和运算符什么是shell变量?-放在内存中的一定存储单元,存储单元中存放变量的值,这个值是可以改变的。变量有哪些?-本地变量-环境变量-位置变量-标准变量-特殊变量Page14第二章变量和运算符本地变量-是用户现在的shell脚本生命周期中使用的变量;在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:#!/bin/bash#!/bin/bash##对变量赋值:对变量赋值:a=a=““helloworldhelloworld””##现在打印变量现在打印变量aa的内容:的内容:echoecho““Ais:Ais:””echo$aecho$aPage15第二章变量和运算符本地变量(续)有时候变量名很容易与其他文字混淆,比如:num=2num=2echoecho““thisisthe$thisisthe$numndnumnd””这并不会打印出“thisisthe2nd”,而仅仅打印“thisisthe”,因为shell会去搜索变量numnd的值,但是这个变量是没有值的。可以使用花括号来告诉shell我们要打印的是num变量:num=2num=2echothisisthe${echothisisthe${num}ndnum}nd这将打印:thisisthe2ndPage16第二章变量和运算符环境变量由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。环境变量用于所有用户进程(经常称为子进程)。登录进程为父进程,shell中执行的用户进程称为子进程。不像本地变量(只用于现在的shell)环境变量可以用于所有子进程,包括编辑器、脚本和应用。使用export进行设定例如:exportTEST=exportTEST=““beijingbeijing””使用env进行查看所有环境变量。Page17第二章变量和运算符变量替换用变量的值替换它的名字在变量名前加$,使用echo命令可以显示单个变量的取值。例如:test=test=““thisisatestthisisatest””echo$testecho$testPage18第二章变量和运算符${name}显示实际值到name${name:+value}如果设置了name,则显示值value,否则,为空${name:?value}如果未设置name,显示用户定义错误信息value${name:-value}如果未设置name,则显示值value${name:=value}如果未设置name,设置其值value,并显示变量替换(续)Page19第二章变量和运算符变量清除格式:unset变量名例如:test=test=““thisisatestthisisatest””echo${test}echo${test}得到结果:Thisisatestunsettestunsettestecho${test}echo${test}得到结果:空白Page20第二章变量和运算符位置变量位置变量表示:$0,$1……$9向脚本中使用位置参数向系统命令传递参数例子:parameter.shparameter.shparameter2.shparameter2.sh$0$1$2$3$4$5$6$7$8$9脚本名字abcdefPage21第二章变量和运算符特殊变量$#(传递到脚本的参数个数)$*(以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可以超过9个)$$(脚本运行的当前进程ID号)$!(后台运行的昀后一个进程的进程ID号)$@(与$#相同,但是使用时加引号,并在引号中返回每个参数)$-(显示shell使用的当前选项,与set命令功能相同)$?(显示昀后命令的推出状态。0表示没有错误,其他任何值表明有错误。)Page22第二章变量和运算符运算符运算符是对计算机发出的指令。运算对象数字、字符(字面值)变量表达式表达式:运算符和运算对象的组合体Page23第二章变量和运算符运算符类型按位运算符:~,,,&,|,^$[]:告诉shell对方括号中的表达式求值。例子:#!/bin/bash#!/bin/bash#$[]#$[]演示演示echo$[2+3]echo$[2+3]Page24第二章变量和运算符运算符类型-按位运算符运算符说明~op1反运算符(0变1,1变0)op1op2右移运算符(右移除以2,左边补0)op1op2左移运算符(每左移一位则乘以2)op1&op2与比较运算符(都为1则为1,否则为0)op1|op2或比较运算符(有一个为1则为1,否则为0)op1^op2异或比较运算符(互补则为1,否则为0)Page25第二章变量和运算符运算符类型-赋值运算符=,+=,-=,*=,/=,%=,&=,^=,|=,=,=表达式letcount=$count+$changeletcount+=$change例子:varvar=100=100letletvarvar+=4+=4echo$echo$varvar输出结果104Page26第二章变量和运算符$[]可以接受不同基数的运算;格式$[base#n];base可以是2-64的任何基数;例子:echo$[2#11+1]echo$[2#11+1]结果?Page27第二章变量和运算符双引号-值替换变量-例子:echoecho““12$x12$x””单引号-直接引用变量-例子:echoecho‘‘12$x12$x’’反引号-执行命令-例子:echo`echo`echo$HOSTNAME`echo$HOSTNAME`反斜线-转意符:&*+^$`“|?Page28第二章变量和运算符作业char1=‘$LONG,howareyou!’char2=“$LONG,howareyou!”变量char1与char2的值相同吗?为什么?$[3^0]的结果?为什么?$[3|1]的结果?为什么?$[3&2]的结果?为什么?$[3||1]的结果?为什么?$[3&&2]的结果?为什么?$[10#8+1]的结果?为什么?Page29第三章shell输入与输出Page30第三章shell输入与输出echoreadcattee管道文件重定向标准输入输出Page31第三章shell输入与输出输入-参数输入Commandargument1argument2…$0代表执行命令$1代表参数1$2代表参数2-标准输入Readargument1argument2类似于C中的scanf输出Echo–e可以使用Linux终端屏幕控制例子:echoecho--nene\\033[31m033[31mhelloworld!helloworld!;echo;echo--ee\\033[0m033[0mPage32第三章shell输入与输出echo-echo命令可以显示文本行或者变量,或者把字符串输入到文件。echo[option]string--e解析转义字符--n回车不换行,linux系统默认回车换行-转义符(\c,\f,\t,\n)-\c回车不换行-\fclear屏幕-\t一个tab-\n换行(回车换行?)-例子:echod.shechod.shPage33第三章shell输入与输出read语句可以从键盘或文件的某一行文本中读取信息,并将其赋给一个变量。readvarible1varible2…-如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或者回车;如果给出了多个变量,他们按顺序分别被赋予不同的变量。Shell将用空格作为变量之间的分隔符。Page34第三章shell输入与输出read举例#!/bin/bash#!/bin/bash##readnamereadnameechoecho--nFi