Shell_编程.pdf
Shell Shell 编程基础$cat example01#!/bin/bash#This is to show what a example looks like.echo Our first exampleecho#This inserts an empty line in output.echo We are currently in the following directory.pwdechoecho This directory contains the following filesls一个简单的 shellshell 程序一个简单的 shellshell 程序 运行结果:一个简单的 shellshell 程序 前面例子的结构:#!用作shell 命令的完全路径:显示了哪个shell 执行这些命令。#开始:整个行就被当作一个注释。执行时被忽略。命令和控制结构 创建shell 程序的步骤:第一步:创建一个包含命令和控制结构的文件。第二步:修改这个文件的权限使它可以执行。使用chmod u+x 第三步:执行 ./example使用变量 变量是 shellshell 传递数据的一种方法。变量是用来代表每个值的符号名。ShellShell 有两类变量:临时变量和永久变量。临时变量是 shellshell 程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。永久变量是环境变量,其值不随 shellshell 脚本的执行结束而消失。用户自定义变量 用户定义的变量由字母或下划线打头,由字母、数字或下划线序列组成,并且大小写字母意义不同。变量名长度没有限制。在使用变量值时,要在变量名前加上前缀“$”。设置和使用变量设置变量:习惯上用大写字母来命名变量。变量名只能以字母表中的字符开头,不能用数字。例如,1VAR1VAR 是非法变量。变量赋值:赋值号“=”=”两边应没有空格。定义时赋值,如 str1=abcdefgstr1=abcdefg 将一个命令的执行结果赋给变量,如:A=date B=$(ls -l)A=date B=$(ls -l)将一个变量赋给另一个变量,如:A=$BA=$B使用 echoecho 命令用于查看一个变量值。例如:echo$Aecho$A设置和使用变量 设置和使用变量 设置和使用变量 设置和使用变量 可以利用变量和其它字符组成一个新的字符串。设置和使用变量 列出所有的变量:set set 命令 包含多个字的变量:$NAME=Mike Ron$NAME=Mike Ron 运行时出错,应改为:$NAME=“Mike Ron”$NAME=“Mike Ron”或$NAME=Mike$NAME=Mike RonRon 修改变量:$NAME=“$NAME Junior”$NAME=“$NAME Junior”设置和使用变量 设置和使用变量 设置和使用变量 单引号和双引号的区别:$NAME=$NAME Junior$NAME=$NAME Junior$echo$NAME$echo$NAME$NAME Junior$NAME Junior 单引号之间的内容原封不动地指定给了变量。删除变量:$unset NAME$unset NAME设置和使用变量 设置和使用变量 位置变量和特殊变量 Shell 解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数。例如:$example file1 file2 file3$0 这个程序的文件名 example$n 这个程序的第 n 个参数值,n=1.9特殊变量 有些变量是一开始执行 Script 时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,用户无法将一般的系统变量设定成只读的。以下是一些等殊变量:$*这个程序的所有参数$#这个程序的参数个数$这个程序的 PID$!执行上一个后台指令的 PID$?执行上一个指令的返回值 特殊变量 当你执行程序时的参数数目超过 9 个时,可以使用 shift 命令将参数 往前移一格,如此即可使用第 10 个以后的参数。除此之外,还可以用 set 命 令改变$n 及$*,方法如下:set string 如此$*的值即为 string,而分解后则会放入$n。如果 set 命令后面没有参数,则会列出所有已经设定的变量以及其值。变量使用的命令#!/bin/bash var1=abcd efg echo$var1 var2=1234 echo The value of var2 is$var2 echo$HOME echo$PATH echo$PWD变量使用的命令 ShellShell 命令 ReadRead 命令:从键盘读入数据,赋给变量 如:read var1 var2 var3read var1 var2 var3ReadRead 命令 Read Read 的例子:#!/bin/sh read first second third echo the first parameter is$first echo the second parameter is$second”echo the third parameter is$thirdReadRead 命令 exprexpr 命令 ShellShell 变量的算术运算:exprexpr 命令:对整数型变量进行算术运算 如:expr 3+5 expr$var1-expr 3+5 expr$var1-5 5 expr$var1/$var2expr$var1/$var2 expr$var3*10expr$var3*10ShellShell 命令Expr2 程序的例子:#!/bin/sha=10b=20c=30value1=expr$a+$b+$cecho The value of value1 is$value1value2=expr$c/$becho The value of value2 is$value2value3=expr$c*$becho The value of value3 is$value3value4=expr$a+$c/$becho The value of value4 is$value4复杂的 ShellShell 命令 复杂的运算:expr expr 5+7/$var4expr expr 5+7/$var4 将运算结果赋予变量:$var4=expr$var1/$var2$var4=expr$var1/$var2 指示命令行的参数个数 引用变量$#argv 可以指示参数的个数。这个变量的值指示的是参数的个数,而不是命令行总的字段个数。mycom arg1 arg2 sh mycom arg1 arg2指示命令行的参数个数 echo Now begin to test mycom.echo The command is$0.echo The first argument is$1,and the second argument is$2.echo The entire command is$0$1$2 echo And there are$#arguments totally.echo The end of testing.指示命令行的参数个数 变量测试语句 变量测试语句:用于测试变量是否相等、是否为空、文件类型等。格式:test test 测试条件 测试范围:整数、字符串、文件变量测试语句 字符串测试:test str1=str2 test str1=str2 试字符串是否相等 test str1!=str2 test str1!=str2 试字符串是否不相等 test str1 test str1 试字符串是否不为空 test -n str1 test -n str1 试字符串是否不为空 test -z str1 test -z str1 测试字符串是否为空变量测试语句 假设变量 varvar 的值是“hello”hello”:$var=“hello”$var!=“gello”$var!=“hello”变量测试语句 整数测试:test int1-eq int2 test int1-eq int2 测试整数是否相等 test int1-ge int2 test int1-ge int2 测试int1int1 是否=int2=int2 test int1-gt int2 test int1-gt int2 测试int1int1 是否int2int2 test int1-le int2 test int1-le int2 测试int1int1 是否=int2=int2 test int1-lt int2 test int1-lt int2 测试int1int1 是否int2int2 test int1-ne int2 test int1-ne int2 测试整数是否不相等变量测试语句 文件测试:test -d file test -d file 指定文件是否目录 test -f file test -f file 指定文件是否常规文件 test -x file test -x file 指定文件是否可执行 test -r file test -r file 指定文件是否可读 test -w file test -w file 指定文件是否可写 test -e file test -e file 指定文件是否存在 test -s file test -s file 文件的大小是否非0 0变量测试语句 变量测试语句一般不单独使用,一般做 为 ifif 语句的测试条件,如:if test -d$1 then if test -d$1 then fifi 变量测试语句可用 进行简化,如 test -d /etc test -d /etc 等价于 -d/etc-d/etc变量测试语句#!/bin/shif$#-ne 2;then echo Not enough parameters exit 0fiif$1-eq$2;then echo$1 equals$2elif$1-lt$2;then echo$1 littler than$2elif$1-gt$2;then echo$1 greater than$2fi变量测试语句 文件控制语句#!/bin/bashif$#-gt 1 then echo Too many parameters exit 1fiif$#-eq 0 then echo Too few parameters exit 1文件控制语句fiif !-d$1 then echo Usage:$1 directory exit 0fi文件控制语句 流控制语句 流控制语句:用于控制 shellshell 程序的流程 exitexit 语句:退出程序的执行,并返回一个返回码,返回码为 0 0 表示正常退出,非 0 0 表示非正常退出 例如:exit 0exit 0流控制语句 if句的流程流控制语句 if then fiif then fi 语句,例如:if -x if -x /usr/local/apache/apachectl/usr/local/apache/apachectl thenthen /usr/local/apache/apachectl/usr/local/apache/apachectl fifi流控制语句 if/else句的流程流控制语句 多个条件的联合:-a-a 或&:逻辑与,仅当两个条件都成立时,结果为真-o-o 或|:逻辑或,两个条件只要有一个成立,结果为真流控制语句 更复杂的 ifif 语句:if if 条件 1 then 1 then 命令 1 1 elif elif 条件 2 then 2 then 命令 2 2 elseelse 命令 3 3 fifi流控制语句 :if/else 嵌套的流程流控制语句echo please input a file name:cread file_nameif -d$file_name then echo$file_name is a directoryelif -f$file_name then echo$file_name is a common fileelif -c$file_name-o-b$file_name then echo$file_name is a device fileelse echo$file_name is an unknown filefi流控制语句 流控制语句 caseesaccaseesac 语句,格式:case case 变量 inin 字符串 1)1)命令列表 1 1 ;.字符串 n)n)命令列表 n n ;esac;esac流控制语句 流控制语句#!/bin/sh echo*echo Please select your operation:echo 1 Copy echo 2 Delete echo 3 Backup echo*read op流控制语句case$op in C)echo your selection is Copy ;D)echo your selection is Delete ;B)echo your selection is Backup ;*)echo invalide selectionesac流控制语句 循环语句 fordonefordone 语句 格式:for for 变量 in in 名字表 dodo 命令列表 donedone循环语句 图示:循环语句 例子:#!/bin/bash for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday do echo The day is:$DAY done循环语句 循环语句 WhileWhile 语句,格式:while while 条件 dodo 命令 donedone循环语句 图示:循环语句#!/bin/sh num=1 while$num-le 10 do square=expr$num*$num echo$square num=expr$num+1 done循环语句 循环语句 echo The while loop example.echo VAR1=1 while(VAR1100)do echo Value of the variable is:$VAR1 (VAR1=VAR1*2)done echo echo The loop execution is finished循环语句Break&continueBreak&continue 跳出循环:breakbreak 和 continuecontinue BreakBreak:跳出整个循环 ContinueContinue:跳过本次循环,进行下次循环end_loop 例子:#!/bin/shwhile truedo echo*echo Please select your operation:echo 1 Copy echo 2 Delete echo 3 Backup echo 4 Quit echo*read op case$op in C)echo your selection is Copy ;D)echo your selection is Delete ;B)echo your selection is Backup ;Q)echo Exit.break ;*)echo invalide selection,please try again continue esac done ShiftShift ShiftShift 指令:参数左移,每执行一次,参数 序列顺次左移一个位置,$#$#的值减 1 1,用于分别处理每个参数,移出去的参数 不再可用 例如:$1$2$3$4$1$2$3$4$1$2$2$3ShiftShift 的例子:if$#-le 0 then echo Not enough parameters exit 1fisum=0while$#-gt 0 do sum=expr$sum+$1 shiftdoneecho$sum 函数 函数的定义:函数名()()命令序列 函数的调用:不带()()函数名 参数 1 1 参数 2 2 函数中的变量:变量均为全局变量,没有局部变量 函数中的参数:调用函数时,可以传递 参数,在函数中用$1$1、$2$2 来引用 函数 function 的例子:abc=123 echo$abc#定义函数 example1()abc=456#调用函数 example1 echo$abc#定义函数,使用参数 example2()echo$1 echo$2#调用函数,向它传递参数 example2 aaa bbb