Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21254
  • 博文数量: 13
  • 博客积分: 325
  • 博客等级: 一等列兵
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-28 14:33
文章分类

全部博文(13)

文章存档

2012年(13)

分类: LINUX

2012-10-26 10:35:38

    与其他程序语言不同的是,Bash Shell没有所谓的“数据类型”,Bash Shell在默认情况下,不会区分这是整数变量、浮点数变量还是字符变量,除非使用内置命令declare特别指定变量的类型。在Bash Shell中只有一种数据形态:以字符组成的字符串,即:Bash Shell把任何存放在变量中的值,皆视为以字符组成的“字符串”。这是非常需要注意的一点。


1、设定变量
    
    设定变量的语法: 变量名称=值
    在设定变量时,需要注意的是:等号两边紧邻的,不可以有空白。通常比较好的习惯是,把字符串(值)用双引号或单引号括起来,且等号右边的值含有空白,一定要用引号引起来。例如

  1. myname=wsp                      #这种方式也可以,更好的习惯是 myname="wsp"  
  2. yourname="Black Jack"           #右边一定要用引号,因为字符串中出现了空格
    另外,在写Script时,为了怕打错变量名称,造成排错上的困难,我们可以规定:变量一律要经过设定,程序才能使用。做法如下例:

  1. #!/bin/bash
  2. shopt -s -o nounset       #-s 打开选项; -o是指可以使用set -o设定的选项
  3.                           #nounset 表示变量一定要先设定,才能使用
  4. declare Infomix=50        #declare声明变量Infomix,并设值为50
  5. echo $Infomix             #显示结果:50
  6.                           #若这里把变量名字写错了,执行时就会显示错误信息

2、取得变量值
    
    “变量值”指的是:变量名称所代表的内存空间所存储的内容。
     取得变量值的方法是,在变量名称前面加上$,形式如下:

  1. $变量名称   或  ${变量名称}
     需要注意的是,如若变量的后面接有英语单词或底线,需要用{}把$和变量名称隔开,否则shell无法正确判断变量。例如

  1. myname="wsp"
  2. echo $myname                 #显示 wsp
  3. echo Hi,${myname}Mmmm        #显示 wspMmmm
     $放在变量名之前,表示要取变量值,但如果要显示$这个字符,需要使用\符号,转义其特殊意义,或者使用单引号。

  1. I=8
  2. echo \$I             #显示 $I
  3. echo '$I'            #显示 $I


3、取消和情况变量

   (3-1)取消变量
    在Shell Script中需要取消某一个变量或函数,这个动作称为“取消变量”。取消变量是把该变量由变量空间释放。不过,若某变量的属性是只读的话,则不能删除该变量。
    取消变量的方法:使用unset
    unset的后面可以接变量名或函数名。用法如下:

  1. unset 变量名称               #先尝试取消变量,若失败,再尝试取消与该变量同名的函数
  2. unset -v 变量名称            #-v 表示取消变量
  3. unset -f 函数名称            #-f 表示取消函数
   
    (3-2)清空变量
    unset不但把变量的内容(值)清空,而且让这个变量不存在。和unset的做法有一点接近的是“清空变量”。清空变量是把变量的内容删除,其值为null(空),但该变量仍然存在(在变量空间中),这和取消变量是不一样的。
    “清空变量”的做法是: 变量名称=
     这个方法,其实是把变量重新设定一个空值给它,等号右边是空的。


4、变量和引号

    用单引号或双引号把值括起来,是否有差别? 有。
    在双引号中,可以进行如下三个操作:(1)替换变量 (2)替换命令执行结果 (3)替换算术运算结果。若想抑制在双引号中替换变量,可以使用\转义$。而单引号的作用则是形成一个所见所得的字符串(即写什么,就显示什么),不会进行任何的变量操作。

  1. myname="Bash Shell"
  2. HelloWord1="Hi,I am $myname"
  3. echo $HelloWord1                  #显示:Hi,I am Bash Shell

  4. HelloWord2='Hi,I am $myname'
  5. echo $HelloWord2                  #显示:Hi,I am $myname
  6. HelloWord3="Hi,I am \$myname"
  7. echo $HelloWord3                  #显示:Hi,I am $myname

5、变量的有效范围与环境变量

    变量一旦设定之后,只有在该shell的环境中有效,它无法影响其他shell环境中的变量。因此,一旦script文件执行完毕(该script执行时为目前shell的子shell),该script的变量即不再有效。
    那么,变量要如何处理,才能为子shell取用?
    当子shell产生时,它会继承父shell的环境变量等条件,因此,只要使变量成为环境变量,就能为子shell取用。变成环境变量的方法可使用export这个命令:

  1. testVAR="Hello World"
  2. export testVAR
  3. #也可以等价成下面一行
  4. export testVAR="Hello World"
     export是Bash的内置命令,用途是把某一变量输出,变成环境变量,以使后续的各种操作(包括子shell)皆可用于提取该变量的内容。若执行export 或 export -p,会列出目前所有的环境变量。另外,“declare -x 变量名称”这一指令也可以把某一个变量变成环境变量,例如

  1. declare -x textVAR="Hello World"    #这个作用和export是一样的
     取消环境变量的方法和取消变量是一样的,可以用=号把变量内容清空,或用unset命令把变量取消。
     


6、Bash 的内置变量

    Bash默认建立了许多内置变量。这里先少量介绍几个。

   (6-1)BASH
    用途:Bash的完整路径名。通常是:/bin/bash 或 /usr/local/bin/bash。 用例:echo $BASH

   (6-2)BASH_VERSION
    用途:Bash的版本。 用例:echo $BASH_VERSION

   (6-3)HOME
    用途:设定用户家目录的位置。通常,root的家目录是/root,一般用户的家目录在/home/账号。替换 ~ 的结果,就是HOME变量值。

   (6-4)HOSTNAME
    用途:主机名。用例:echo $HOSTNAME

   (6-5)HOSTTYPE
    用途:主机形态。例如i386.

   (6-6)IFS
    用途:定义字段分隔符。默认值为:空格符、tab字符、换行字符(newline)

   (6-7)LANG
    用途:目前语系(locale)的名称。 用例:echo $LANG

   (6-8)PATH
    用途:命令的搜索路径。 用例为:echo $PATH。 如果要自行添加搜索路径,一般的做法为:export PATH=/root/bin/:$PATH。这样可以在PATH增加路径/root/bin。

   (6-9)PS1
    用途:主要提示符号。 默认值为\s\v\$。其中,\s表示shell的名称,\v表示bash的版本号,\$表示若使用者是root,则替换成'#',否则替换成'$'。
    
   (6-10)SHELL
    用途:shell的文件路径。默认为'/bin/bash'。

   (6-11)UID
    用途:用户代码,即密码文件账号中的第3个域值。

   (6-12)$1~$n
    用途:位置参数。传入程序或函数式的参数,第一个参数是$1,第二个参数是
$2,其他类推。若位置参数n超过9个以上,则要用${n},例如${10}。 需要注意的是:$0代表执行程序的名称本身。

   (6-13)$*
    用途:代表所有的位置参数,并且视为一个字符串。例如:tes.sh ABC 123 xyz, 则$*的内容为字符串"ABC 123 xyz"。

   (6-14)$@
    用途:代表所有的位置参数,但$@代表各位置参数组成的串行。例如:tes.sh ABC 123 xyz, 则$*的内容为"ABC"、"123"、"xyz"这3个字符串。


   (6-15)$#
    用途:位置参数的个数。例如:tes.sh ABC 123 xyz, 则$#的值为3。


   (6-16)$?
    用途:上一个命令执行结束后的传回值。通常0代表执行成功,非0代表有误。


   (6-17)$$
    用途:目前bash shell的进程编号。

   (6-18)$!
    用途:上一个后台程序的进程编号。


7、调整变量属性

     不能修改内容的变量称为只读变量。通常,使用只读属性来定义不变常数。Bash 有两个内置命令,可以定义只读变量:readonly 和 declare 。

    (7-1)只读变量:使用readonly命令
     readonly的语法为:readonly 变量名称  

  1. readonly pi=3.14               #如果再试图给pi赋值,就会提示pi是只读的
     readonly的其他用法:执行readonly 或readonly -p 显示目前具有只读属性的变量列表; readonly -a 数组变量,设定只读数组。


    (7-2)只读变量:使用declare命令
     declare的语法: declare -r 变量名称

  1. declare -r pi=3.14             #如果再试图给pi赋值,就会提示pi是只读的 
     declare除了可以调整只读属性,还有其他用法,如下:


  1. 选项      用途             用例                   释义

  2. -p     显示变量的属性     declare -p x         显示变量x的属性
  3. -a     变量是一个数组     declare -a arry      设定arry是一个数组
  4. -i     变量是一个整数     declare -i a         设定变量a是整数形态
  5. -r     设定只读变量       declare -r a         设定变量是只读变量
  6. -x     设为环境变量       declare -x PATH      设定PATH为环境变量



8、别名

     替指令取一个短而方便的代称,这样的机制称为“别名”。
     Bash的内置命令alias可以用来建立别名, 其语法为:alias 别名=指令。需要注意的是,=号两旁不可以有空格,如果等号右边的指令还有空白,需要用单引号含括该指令。此外,直接执行alias 或 alias -p 可显示目前已设定的别名。

  1. alias ll='ls -l --color=auto'           #执行ll就等于执行 ls -l --color=auto
  2. alias cp='cp -i'                        #别名可以跟原命令名相同
     取消别名的方法是:unalias 别名,例如:unalias ll。如果要取消所有别名,可以使用 unalias -a。


9、数组

     数组是一种数据结构,每个数据项称为数组元素,且可以使用索引的方式获得各元素的值。bash的数组,其元素个数没有限制,数组的索引由0开始,但不一定连续(可以跳跃)。索引页可以用算术表示式,如1+2。不过,bash仅只是一维的数组(与Bash版本有关)。

    (9-1)数组的用法
     直接举例说明:

  1. A[0]=5                       #这里创建了一个数组A,需要注意的是索引从0开始
  2. A[4]=10                      #可以跳跃
  3. A[3]="bash shell"            #需要的话,可以随时增加元素
     欲显示或取得某一个元素值,其语法为: ${数组[索引值]},例如:echo ${A[0]}、 echo ${A[1+1]}。当然数组还有其他的建立方法:

  1. B=(23 88 99 66)                  #一次顺序设定每个元素的值
  2. echo ${B[2]}                     #显示99
  3. C=([3]=77 [1]=100 [5]=66)        #指定个别元素的索引
  4. echo ${C[5]}                     #显示66
    
    (9-2)取出数组所有的元素
     bash可以一次取出所有的元素,语法为:${数组[@]} 或 ${数组[*]}。区别是${数组[@]}得到是以空格隔开的元素,而${数组[*}得到一整个字符串。

  1. B=(23 88 99 66)
  2. echo ${B[@]}             #显示的是23 88 99 66
  3. echo ${B[*]}             #${B[*]} 得到的是"23 88 99 66"
   
    (9-3)取出数组元素的个数
     计算数组元素的个数(长数组度)的语法是:${#数组[@]} 或 ${#数组[*]}。

  1. B=(23 88 99 66)
  2. echo ${#B[@]}              #显示4

  3. A[3]="bash shell"          #若数组元素是字符串,可以通过语法:${#数组[索引]} 获取元素长度
  4. echo ${#A[3]}              #显示10


10、自定义环境

     Bash Shell的启动配置文件机制,可以为用户提供自定义工作环境。使用者可以比较启动配置文件,安排方便工作的环境。自定义环境的主要目的是为了让用户登录主机时,能拥有安全及易于执行的命令环境,包括:建立文件的权限,命令搜索路径、环境变量、别名、显示文件使用的颜色等等。
     通常,可以自定配置的文件是:~/.bash_profile 和 ~/.bashrc。这里的~只的是家目录。一般会在.bash_profile中设定可以一体适用的命令、搜索路径及环境变量,而把其他大部分的设定放在.bashrc中,比如别名等。


阅读(1125) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~