《shell学习资料.docx》由会员分享,可在线阅读,更多相关《shell学习资料.docx(33页珍藏版)》请在启牛文库网上搜索。
1、shell学习资料目录1.1 变量的命名1.2 变量的赋值1.3 变量的类型2.1 使用 expr 命令对算术表达式求值2.2 使用 $( . ) 的方式对算术表达式求值3.1 bash 计算器 bc3.2 在脚本中使用 bc5.1 if 语句 5.2 case 语句5.3 for 语句5.4 while 与 until 语句 本文介绍一下 shell 的语法! 一、变量在 shell 里,使用变量之前通常并不需要事先为他们做出声明,需要使用的时候直接创建就行了! 默认情况下,所有变量都被看做字符串并以字符串来存储,即使它们被赋值为数值时也是如此! shell 和一些工具会在需要时把数值型字符
2、串转换成对应的数值以对它们进行操作! 1.1 变量的命名shell 变量的命名规则如下:开头是一个字母或下划线,后面可以接任意长度的字母、数字或下划线符号,变量名的字符长度并无限制(Bourne shell中)! 不过为了兼容性(一些早期的shell里变量名是有长度限制的),一般还是不要超过255个字符! 另外,Linux 区分大小写! 当用户自己定义变量的时候,要注意变量名不能与 shell 中的关键字重名! 1.2 变量的赋值shell 中变量的赋值方式如下:变量名=值 # 注意 赋值语句两边不能有空格注意,赋值语句两边不能有空格(即 “=” 号两边不能有空格)! 等号右边若有空格的话,需
3、要加上引号(单引号或双引号都是可以的)! shell 中可以在变量名前加上 $ 字符来取变量的值! 用一个简单的例子演示一下: #!/bin/bash name=tongye age=23 address=Hubei Wuhan money=10$ echo $name $age in $address echo I have $money! exit 0 输出结果如下:这里需要注意的是单引号和双引号的用法:在单引号中,所有特殊字符都没有特殊含义;在双引号中,$、 (反引号)、 有特殊含义,其余的没有特殊含义! 至于反引号 ,反引号中可以用来引用系统命令,其中的内容将会被优先执行,其功能与 $
4、(.) 一样,详情后面再做叙述! 1.3 变量的类型shell 中有四种类型的变量:用户自定义变量、环境变量、位置参数变量和预定义变量! 1) 用户自定义变量 用户自定义变量只会在当前 shell 中生效,也就是“局部变量”,上面程序中的 name、age、address、money 等都是用户自定义变量,只能在变量所在的那个 shell 脚本中生效! 用户自定义变量一般用小写字母来命名! 2) 环境变量当一个 shell 脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化,这些变量通常用大写字母做名字,以便与用户自定义变量做区分,被称为环境变量! 环境变量可以在当前 shell 和这
5、个 shell 的所有子 shell 中生效! 如果把环境变量写入相应的配置文件(如 /etc/profile ),那么这个环境变量就会在所有的 shell 中生效! 系统自带的环境变量的名字不可更改,但是值可以按需更改! 用户也可以使用 export 命令在 shell 中自己创建环境变量:export 变量名=变量值 # 创建环境变量并赋值一些主要的系统环境变量如下:环境变量 描述 $HOME当前用户的家目录$PATH以冒号分隔的用来搜索命令的目录列表,决定了 shell 将到哪些目录中去寻找命令或程序$PS1命令提示符,通常是 $ 字符,也可以自行设置$PS2二级提示符,用来提示后续的输
6、入,通常是 字符$IFS输入域分隔符! 当 shell 读取输入时,它给出用来分隔单词的一组字符,通常是空格、制表符和换行符$0shell 脚本的名字$#传递给脚本的参数个数$shell 脚本的进程号(PID),脚本程序通常会用它来生成一个唯一的临时文件,如 /tmp/tmpfile_$ 3) 位置参数变量位置参数变量主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用也是固定的! 主要有以下几种位置参数变量:位置参数变量描述$1、$2、.脚本程序的参数,分别代表程序的第1个参数、第2个参数、. 程序第10个以上的参数需要用大括号包含,如 $10$*代表命令行中的所有参数! 在一个变量中
7、将所有参数列出,各参数之间用环境变量 IFS 中的第一个字符分隔开! $和 $* 一样,也包含了命令行中的所有参数,但是不使用 IFS 环境变量,即使 IFS 为空,参数也是分开显示的关于 $0 和 $#,在有些资料上,也把这两个归为位置参数变量,本文是把它们归为了环境变量! 其中,$0 代表 shell 脚本本身(不算在参数行列),$# 代表传递给脚本的参数个数(不包括 $0)! 关于 $* 和 $,这二者的区别就在 $* 使用 IFS 所定义的分隔符来分隔参数而 $ 没有使用! $* 将所有的参数视为一个整体,而 $ 将所有的参数分别视为单独的个体! 一般来说,采用 $ 来访问脚本程序的参
8、数会比较好,不必担心 IFS 所设置的分隔符为空而导致各参数连在一起分不清楚! 4) 预定义变量预定义变量是在 bash 中已经定义好了的变量,变量名不能自定义,变量作用也是固定的! 实际上,位置参数变量就是预定义变量的一种! 除了上面介绍的一些外,这里再介绍两个:$? :保存最后一次执行的命令的返回状态! 如果 $? 的值为 0 ,则表明上一个命令成功执行;如果值非 0 ,则表明上一个命令没有成功执行! $! :用于保存后运行的最后一个进程的 PID 号! 二、算术运算shell 的算术运算符与 C 语言里的差不多,优先级与顺序也相同! 但是,由于 shell 中所有变量都是被看做字符串来存
9、储的,因此,要处理算术表达式,还需要使用一些特殊手段将数值型字符串转换成相应的数值! 2.1 使用 expr 命令对算术表达式求值expr 命令将它的参数当做一个表达式来求值,可以用来进行数学运算! 如下:#!/bin/basha=2b=3c=expr $a + $becho $cexit 0这段代码的输出结果是:5 ! 注意使用 expr 命令的那一行,使用的是反引号 ,反引号中的内容会被优先执行,所以这一行代码的作用是将 expr $a + $b 这一表达式的执行结果赋给变量 c ! 也可以使用 $(.) 来替代反引号: c=$(expr $a + $b)! 关于反引号和 $( . ) 表
10、达式,需要说明的一点是,反引号是一种比较老的语法形式,如果你希望自己写的脚本具备非常好的可移植性,那么可以使用反引号,新的脚本程序一般都使用 $(.) 来替代反引号了,以避免在反引号中处理一些特殊字符时需要应用的一些相对复杂的规则! 比如,如果想在 . 结构中使用 (反引号)字符,则需要使用转义符 来进行转义,这样会使代码阅读起来较为困难! 反引号和 $( . ) 都可以用来引用系统命令! expr 命令的功能十分强大,可以支持许多表达式求值运算:表达式说明expr1 | expr2若 expr1 非零,则等于 expr1 ,否则等于 expr2! expr1 & expr2只要有一个表达式为
11、零,则等于零,否则等于 expr1! expr1 = expr2等于(与 = 是同义的),若两式相等则结果为1,不等结果为0expr1 expr2大于expr1 = expr2大于等于expr1 expr2小于expr1 = expr2小于等于expr1 != expr2不等于expr1 + expr2加expr1 - expr2减expr1 * expr2乘expr1 / expr2整除expr1 % expr2取余注意:在 expr 命令所支持的操作符中,“ | 、 & 、 、 、 = 、 * ” 这几个需要用 符进行转义再使用! 此外,表达式的各字符之间需要用空格隔开! 用一段代码演示一
12、下 expr 命令的使用方法: #!/bin/bash a=5;b=6;c=0 echo $(expr $a | $c) # 输出 5 echo $(expr $b & $c) # 输出 0 echo $(expr $a & $b) # 输出 5 echo $(expr $a = $b) # 输出 1 echo $(expr $a * $b) # 输出 30 echo $(expr $a = 2) # 输出 1 exit 0 expr 命令中的 | 和 & 操作符比较特殊,并不是我们常见的按位或和按位与,而是逻辑操作:expr1 | expr2 是逻辑或运算,结果为真(1 表示真,0表示假)则
13、返回 expr1 的值,否则返回 expr2 的值,具有短路功能(expr1 为非零,则表达式一定非零,直接返回 expr1 的值,而不必在对 expr2 的值做判断);expr1 & expr2 是逻辑与运算,结果为真则返回 expr1 的值,否则返回 expr2 的值,具有短路功能(expr1 为零,则表达式一定为零,直接返回零,而不必再对 expr2 的值做判断)! 2.2 使用 $( . ) 的方式对算术表达式求值expr 虽然功能强大,但是上面已经提到,在进行一些运算的时候,需要使用 符来进行转义,这对于阅读代码的人来说并不友好! 另一方面,expr 命令执行起来其实很慢,因为它需要调用一个新的 shell 来处理 expr 命令! 更新更好的一种做法是使用 $(.) 扩展的方式! 只需要将准备求值的表达式放在 $(.) 的括号中即可进行简单的算术求值! 且,所有支持 $( . ) 的shell,都可以让用户在提供变量名称时,无须前置 $ 符! 用一段代码演示一下用法: #!/bin/bash a=5;b=6 echo $($a + $b)# 输出 11 ! 在变量名前加上 $,这在shell中一般是取变量值的意思 echo $(a + b) # 输出 11 ! 可见,变量前不加 $ 也是可以的,为了简便,后面的代码就不加 $ 了 echo $(a | b) #