shell基础

您所在的位置:网站首页 shell中! shell基础

shell基础

2022-05-20 22:35| 来源: 网络整理| 查看: 265

   本文介绍一下 shell 的语法。 

一、变量

  在 shell 里,使用变量之前通常并不需要事先为他们做出声明,需要使用的时候直接创建就行了。默认情况下,所有变量都被看做字符串并以字符串来存储,即使它们被赋值为数值时也是如此。shell 和一些工具会在需要时把数值型字符串转换成对应的数值以对它们进行操作。

1.1 变量的命名

  shell 变量的命名规则如下:开头是一个字母或下划线,后面可以接任意长度的字母、数字或下划线符号,变量名的字符长度并无限制(Bourne shell中)。不过为了兼容性(一些早期的shell里变量名是有长度限制的),一般还是不要超过255个字符。另外,Linux 区分大小写。当用户自己定义变量的时候,要注意变量名不能与 shell 中的关键字重名。

1.2 变量的赋值

  shell 中变量的赋值方式如下:

变量名=值 # 注意 赋值语句两边不能有空格

  注意,赋值语句两边不能有空格(即 “=” 号两边不能有空格)。等号右边若有空格的话,需要加上引号(单引号或双引号都是可以的)。shell 中可以在变量名前加上 $ 字符来取变量的值。用一个简单的例子演示一下:

#!/bin/bash name=tongye age=23 address="Hubei Wuhan" money='10$' echo "$name $age in $address" echo "I have $money!" exit 0 

  输出结果如下:

  这里需要注意的是单引号和双引号的用法:在单引号中,所有特殊字符都没有特殊含义;在双引号中,"$"、" ` "(反引号)、"\" 有特殊含义,其余的没有特殊含义。至于反引号 " ` ",反引号中可以用来引用系统命令,其中的内容将会被优先执行,其功能与 $(...) 一样,详情后面再做叙述。

 

1.3 变量的类型

  shell 中有四种类型的变量:用户自定义变量、环境变量、位置参数变量和预定义变量。

1) 用户自定义变量 

  用户自定义变量只会在当前 shell 中生效,也就是“局部变量”,上面程序中的 name、age、address、money 等都是用户自定义变量,只能在变量所在的那个 shell 脚本中生效。用户自定义变量一般用小写字母来命名。

2) 环境变量

  当一个 shell 脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化,这些变量通常用大写字母做名字,以便与用户自定义变量做区分,被称为环境变量。环境变量可以在当前 shell 和这个 shell 的所有子 shell 中生效。如果把环境变量写入相应的配置文件(如 /etc/profile ),那么这个环境变量就会在所有的 shell 中生效。系统自带的环境变量的名字不可更改,但是值可以按需更改。用户也可以使用 export 命令在 shell 中自己创建环境变量:

export 变量名=变量值 # 创建环境变量并赋值

  一些主要的系统环境变量如下:

  环境变量                                                           描述                                                                             $HOME 当前用户的家目录   $PATH 以冒号分隔的用来搜索命令的目录列表,决定了 shell 将到哪些目录中去寻找命令或程序   $PS1 命令提示符,通常是 $ 字符,也可以自行设置   $PS2 二级提示符,用来提示后续的输入,通常是 > 字符   $IFS 输入域分隔符。当 shell 读取输入时,它给出用来分隔单词的一组字符,通常是空格、制表符和换行符   $0 shell 脚本的名字   $# 传递给脚本的参数个数   $$ shell 脚本的进程号(PID),脚本程序通常会用它来生成一个唯一的临时文件,如 /tmp/tmpfile_$$

 

3) 位置参数变量

  位置参数变量主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用也是固定的。主要有以下几种位置参数变量:

位置参数变量 描述 $1、$2、... 脚本程序的参数,分别代表程序的第1个参数、第2个参数、... 程序第10个以上的参数需要用大括号包含,如 ${10} $* 代表命令行中的所有参数。在一个变量中将所有参数列出,各参数之间用环境变量 IFS 中的第一个字符分隔开。 $@ 和 $* 一样,也包含了命令行中的所有参数,但是不使用 IFS 环境变量,即使 IFS 为空,参数也是分开显示的

  关于 $0 和 $#,在有些资料上,也把这两个归为位置参数变量,本文是把它们归为了环境变量。其中,$0 代表 shell 脚本本身(不算在参数行列),$# 代表传递给脚本的参数个数(不包括 $0)。

  关于 $* 和 $@,这二者的区别就在 $* 使用 IFS 所定义的分隔符来分隔参数而 $@ 没有使用。$* 将所有的参数视为一个整体,而 $@ 将所有的参数分别视为单独的个体。一般来说,采用 $@ 来访问脚本程序的参数会比较好,不必担心 IFS 所设置的分隔符为空而导致各参数连在一起分不清楚。

 

4) 预定义变量

  预定义变量是在 bash 中已经定义好了的变量,变量名不能自定义,变量作用也是固定的。实际上,位置参数变量就是预定义变量的一种。 除了上面介绍的一些外,这里再介绍两个:

$? :保存最后一次执行的命令的返回状态。如果 $? 的值为 0 ,则表明上一个命令成功执行;如果值非 0 ,则表明上一个命令没有成功执行。

$!  :用于保存后运行的最后一个进程的 PID 号。

 

二、算术运算

  shell 的算术运算符与 C 语言里的差不多,优先级与顺序也相同。但是,由于 shell 中所有变量都是被看做字符串来存储的,因此,要处理算术表达式,还需要使用一些特殊手段将数值型字符串转换成相应的数值。

2.1 使用 expr 命令对算术表达式求值

  expr 命令将它的参数当做一个表达式来求值,可以用来进行数学运算。如下:

#!/bin/bash a=2 b=3 c=`expr $a + $b` echo $cexit 0

  这段代码的输出结果是:5 。注意使用 expr 命令的那一行,使用的是反引号 `` ,反引号中的内容会被优先执行,所以这一行代码的作用是将 expr $a + $b 这一表达式的执行结果赋给变量 c 。也可以使用 $(...) 来替代反引号: c=$(expr $a + $b)。

  关于反引号和 $( .. ) 表达式,需要说明的一点是,反引号是一种比较老的语法形式,如果你希望自己写的脚本具备非常好的可移植性,那么可以使用反引号,新的脚本程序一般都使用 $(...) 来替代反引号了,以避免在反引号中处理一些特殊字符时需要应用的一些相对复杂的规则。比如,如果想在 ` ... ` 结构中使用 ` (反引号)字符,则需要使用转义符 \ 来进行转义,这样会使代码阅读起来较为困难。反引号和 $( ... ) 都可以用来引用系统命令。

  expr 命令的功能十分强大,可以支持许多表达式求值运算:

表达式 说明 expr1 | expr2   若 expr1 非零,则等于 expr1 ,否则等于 expr2。 expr1 & expr2     只要有一个表达式为零,则等于零,否则等于 expr1。 expr1 = expr2   等于(与 == 是同义的),若两式相等则结果为1,不等结果为0 expr1 > expr2   大于 expr1 >= expr2   大于等于 expr1 < expr2   小于 expr1 = 、 *  ” 这几个需要用 \ 符进行转义再使用。此外,表达式的各字符之间需要用空格隔开。 用一段代码演示一下 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 \ expr2 ,则结果为真 expr1 -ge expr2 如果 expr1 >= expr2 ,则结果为真 expr1 -lt expr2 如果 expr1 < expr2,则结果为真 expr1 -le expr2 如果 expr1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3