免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1115 | 回复: 0
打印 上一主题 下一主题

第二章 变量和运算符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-13 03:10 |只看该作者 |倒序浏览

    我们从第一章节了解到什么linux shell,linux的存取权限和安全,更有一个简单的脚本,来辅助说明shell有什么样的特性,通过对shell的学习.大家对linux shell有一个总体的认识.那我们下面开始对第二章更深入了解linux shell中很重要的一个内容.
  第二章 变量和运算符

第一节:变量
    大纲:
        2.1.1 本地变量
        2.1.2 环境变量
        2.1.3 变量替换
        2.1.4 位置变量
        2.1.5 标准shell变量
        2.1.6 特殊变量
        2.1.7 影响变量的命令
        2.1.8 引号
        2.1.9 运算符
        2.1.10 表达式替换
        2.1.11 运算符的优先级
    在进行讲解前,我们要知道什么是shell变量?
        其实linux下面的变量,linx下的shell变量和其它高级语言中的定义是一样的,都是放在内存中一定的存储单元,而这个存储单元里面存放这个变量的值,而这个值是可以改变的,我们就称它为变量.
       2.1.1 本地变量
             定义:是在用户现在的shell生命期的脚本中使用;
            例:[redhat@server redhat]$name="Red Hat Linux"  #把变量设置为Red Hat Linux
               [redhat@server redhat]$echo ${name}   or #显示变量内容
              =[redhat@server redhat]$echo $name       #等同上面的语意
               Red Hat Linux               #显示其设定内容,
               [redhat@server redhat]$set | grep "name"   #查看刚才所设定的内容,或不加'grep "name"'查看用户自己所有的本地变量,
               [redhat@server redhat]$readonly name   #把name这个变量设置为只读变量,不允许再次设置,这可参考变量定义;-_-!
               [redhat@server redhat]$name="He SenLin" #重新赋值
               bash:name:readonly variable      #只读文件系统
               [redhat@server redhat]$readonly  #查看系统存在的只读文件
               附:重新登录一下系统,再次用
               [redhat@server redhat]$echo ${name}   
                                                  #本地变量就不存在了,
             说明本地变量只能存活在用户shell的生命周期中,重登录就不在了,
       2.1.2 环境变量
          定义:环境变量用于所有用户进程,包括编辑器,脚本和应用,登录进程为父进程,shell中执行的用户进程均为子进程,不像本地变量只用于现在的shell.
         存在目录在所有用户的主目录下/.bash_profile或
         如何设置环境变量?第一种方法就是编辑上面的二个文件,还可以用"export"进行设定或更改;这可不像本地变量只需 name="Red Hat Linux"那样简单,但却可以把本地变量更改为环境变量;只须在本地变量结束后,输入:export ;例,我们把name由本地变量修改为环境变量,我们可以这样做;
       [root@server root]#name="Red Hat Linux"  #本地变量
       [root@server root]#export name    #变量name由本地升为环境
    当然也可以用下面这种方法;
       [root@server root]#export name="Red Hat Linux" #直接定义name为环境变量;
       定义后,可通过env进行查看,不知道上面的本地环境变量由哪个命令进行查看你记住了没有?,演示一下查看现在定义的环境变量;
       [root@server root]#env | grep "name"
       Red Hat Linux
       同样不加后面grep "name",这个参数也是查看所有的环境变量;更同样的是我们也可以运行readonly这个参数给name以只读属性;
    Tips:环境变量就是全部包含在本地变量中,注意一点,本地变量不能运行在全部进程中,只有环境变量可以,再不懂就联想一下人与自然吧;-_-!还是不会?用绝招:
      [root@server root]#you=myfriend      #设置本地变量name为myfriend
      [root@server root]#echo ${you}   #查看一下是否成功
      myfriend                      #成功
      [root@server root]#sh        #更换shell环境等同重登录,这相当一个
      sh-2.05b#echo $you             #用户子进程
                           #没显示,说明不存在,真的不存在?
      sh-2.05b#exit        #返回bash环境
      [root@server root]#echo $you    #再次查看;
      myfriend            #又出来了,怎么回事?
      [root@server root]#export you   #把变量you设为环境变量;
      [root@server root]#sh           #再试一次;
      sh-2.05b#echo $you               
      myfriend                      #ok,you see?
      再不懂,,你就把我杀了吧,,什么,你不知道我住在哪?汗-_-!
        再补充一点,就是在sh进程中设置环境变量是可以写回bash环境中,因为bash是父进程,只有老的才有小的,小的怎么才能有老的哩?
    2.1.3  变量替换
       定义:用变量的值替换它的名字.
       查看方式:echo
   可以用echo显示可以单个变量的取值;
      [root@server root]#str="this is example"    #设置本地变量
      [root@server root]#echo "can you see `echo $str`" #显示
      cat you see this is example        #替换就到这了,不明白明再来
变量替换续
除了上面的这个方式以外还有五种哦;别急,一个一个来;-_-!
      格式                             定义
${variable name}           显示实际值到variable name   1

${variable name :+value}    如果设置了variable name,就把value显示,   
                             未设置则为空;                         2
${variable name:-value}    如果设置了variable name,就显示它,未设置就显示
                           value>;                3
${variable name:?value}     未设置提示用户错误信息value;            4
${variable name:=value}     如未设置就把value设置并显示,   5
变量清除:
    unset
    [root@server root]#echo $name   #变量 name是否存在?
    Red Hat Linux                   #存在
    [root@server root]#unset name   #清除name变量
    [root@server root]#echo $name   #是否成功
                                    #成功
注意:如果用readonly限制了只读属性就会失败,还有怎么从环境变量中去掉那个变量呢?还记的用哪个设定环境变量的吗?对.export,只须在它后面加"-n"参数即可
   2.1.4 位置变量
       定义:位置变量表示$0,$1,$2,....$9
       $0   $1   $2   $3   $4
       脚本名  A    B   C    D
      向脚本中使用位置参数;
      向系统命令传递参数;
      例:./test
    [root@server root]#vi /test  #创建并编辑/test文件
    #!/bin/bash
    #test
    echo "这是脚本的第一个名称: $0"
    echo "这是脚本的第二个位置参数: $1"
    echo "这是脚本的第三个位置参数: $2"
    echo "这是脚本的第四个位置参数: $3"
    echo "这是脚本的第五个位置参数: $4"
  [root@server root]#chmod u+x ./test    #加执行权限;
  [root@server root]#./test A B C        #加参数证验
    echo "这是脚本的第一个名称:  ./test
    echo "这是脚本的第二个位置参数: A
    echo "这是脚本的第三个位置参数: B
    echo "这是脚本的第四个位置参数: C
    echo "这是脚本的第五个位置参数:  
        
   [root@server root]#vi test1.sh   #新建一个脚本文件
   #!/bin/bash
   #name:test1.sh
   #to call: test1.sh 755     #使用方式
   find ~ -perm $1 -print
   $2                         #系统命令
   [root@server root]#chmod u+c test1.sh
   [root@server root]#./test1.sh 755 date   #位置一为755,2位date
   /dev/ip
   /dev/iput
   .
   .
   .
   Fri May 13 2:31:54  CST 2006

  2.1.5  标准变量:
     bash默认建立一些环境变量就是标准变量,可以通俗的说就是不是你加的而是装好机子带的那些环境变量, 可在/etc/profile中进行定义,
    命令                    意义
    HOME                   用户主目录
    IFS                    默认分隔符
   MAIL                   邮箱地址   
    MAILCHECK              邮箱检查间隔
    PWD                    用户当前工作目录
    LOGNAME                当前用户登录名
2.1.6 特殊变量
    命令                   意义
    $#                   传递到脚本的参数列表
    $?                   前个命令执行情况,0成功,其它值失败
    $$                   脚本运行的当前进程号
    $!                   运行脚本最后一个命令
    $*                   显示脚本全部参数
2.1.7 影响变量的命令
     declare    设置或显示变量
        -f         只显示函数名
        -r         创建只读变量
        -x         创建转出变量
         -i         创建整数变量
     使用"+"代替"-",可以颠倒选项的意思,-r除外,
    export    用于传递给子shell的变量
     --          表明选项结束,所有后续参数都是实参,
     -f          表明在"名-值"对中的名字是函数名,
     -n          把全局变量转换成局部变量,换句话就是不再传给shell     
     -p          显示全局变量列表,
   shift
      用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1.

    [root@server root]#vi /test
    #!/bin/bash
    #test
    echo "这是脚本的第一个名称: $0"
    echo "这是脚本的第二个位置参数: $1"
    echo "这是脚本的第三个位置参数: $2"
    echo "这是脚本的第四个位置参数: $3"
    echo "这是脚本的第五个位置参数: $4"
    shift
    echo "这是脚本的第二个位置参数: $1"
    echo "这是脚本的第三个位置参数: $2"
    [root@server root]#chmod u+x ./test
    [root@server root]#./test A B C
    echo "这是脚本的第一个名称:  ./test
    echo "这是脚本的第二个位置参数: A
    echo "这是脚本的第三个位置参数: B
    echo "这是脚本的第四个位置参数: C
    echo "这是脚本的第五个位置参数: $4"
    shit            #显示的时候并没有,加在此只会明了
    echo "这是脚本的第二个位置参数: B
    echo "这是脚本的第三个位置参数: C
       给shfit加一个数试一下:
     [root@server root]#vi ./test
       #!/bin/bash
    #test
    echo "这是脚本的第一个名称: $0"
    echo "这是脚本的第二个位置参数: $1"
    echo "这是脚本的第三个位置参数: $2"
    echo "这是脚本的第四个位置参数: $3"
    echo "这是脚本的第五个位置参数: $4"
    shift  2
    echo "这是脚本的第二个位置参数: $1"
    echo "这是脚本的第三个位置参数: $2"
    [root@server root]#./test A B C D
    echo "这是脚本的第一个名称:  ./test
    echo "这是脚本的第二个位置参数: A
    echo "这是脚本的第三个位置参数: B
    echo "这是脚本的第四个位置参数: C
    echo "这是脚本的第五个位置参数: D
    shit 2   #显示的时候并没有,加在此只会明了
    echo "这是脚本的第二个位置参数: C
    echo "这是脚本的第三个位置参数: D
   
       第二节 引号
    2.1 引号的必要性
    2.2 双引号有什么作用
    2.3 单引号的作用
    2.4 反引号的作用
    2.5 反斜杠的作用
2.1 引号的必要性?
      变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是引用错误,为什么会出现这样的错误呢,这就是因为对上面这些号,杠运用的错误?你想不错吗?那就follow me吧!
    2.2 这章节我不多讲,只给一个例子,不懂可以联系我:
hesenlin521@163.com
        以下引用"网中人"的一篇例子;
     
# TOPIC='Q & A'
# 用單引號保留特殊符號和空白
 
# Q1=What\'s\ your\ \"topic\"\?
# echo $Q1
What's your "topic"?
 
# 用 \ 將特殊符號(含引號)和空白跳脫出來
#
# 跳脫後﹐特殊符號和空白都保留下來。
 
# ANS="It is $TOPIC."
# echo $ANS
It is Q & A.
 
# 用雙引號保留變數值($)
#
# 用雙引號﹐顯示出變數值。
 
# WRONG_ANS='It is "$TOPIC".'
# echo $WRONG_ANS
It is "$TOPIC".
 
 
# 用單引號保留特殊符號和空白(同第一行)
#
# 用單引號﹐全部保留﹔同時﹕
# $ 也當成一般符號保留﹐而非變數值。
 
# ALT_ANS='the $TOPIC'\ is\ "'$TOPIC'"\.
# echo $ALT_ANS
The $TOPIC is 'Q & A'.
 
# 同時混合單引號﹑雙引號﹑和跳脫字符 \
#
# 單引號保留全部﹔雙引號保留變數值﹔
# \ 將特殊符號跳脫出來。
    在此,我讲解一下各个引号的作用吧;双引主要是转意$,\,``三个特殊字符的意义,其它的全部当普通字符进行显示,
    单引号,是很冷酷的那种,就是把所有的字符都当一个普通字符来显示,
    [redhat@server redhat]$echo '$PWD,\n is your \n work directory'
    $PWD,\n is your \n work directory
    那个杠就是屏蔽特殊字符的特殊含义,例
    [redhat@server redhat]$echo *
    myfiel bash tehce desktop ....
    [redhat@server redhat]$echo \*
    *
     ok,,就讲这么多了,
第三节 运算符
   顾名思义就是告诉计算机哪些数值应该用哪种运算符进行运算,+,-,*,\,通过表达式对变量,数字,字符用的运算的符号就叫运算符;
   通常表达式:是运算符和数字,变量,字符对象的集合体;
  3.1 运算符类型;
     按位运算符;在其它语言中经常见到哦,
     ~,>,|,^
     $[]表示形式告诉shell求中括号中的表达式的值;
       $[ 2+8 ]
    运算符                  说明                                    
  ~var              反运算符,把var中所有的二进制为1的变为0,为0的变为1
var
                  出的各位,最右端的各位上补上0值,每做一次按位左移就有实
                  var乘2;                                          
var>>str           右移运算符,把var中所有的二进制位向右移动str位,忽略最右
                   移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2,                                                               
var&str        与比较运算符,var和str对应位,对于每个二进制来            
               说,如果二都为1,结果为1.否则为0;                       
var^str         异域运算符,比较var和str对应位,对于二进制来说      
                如果二者互补,结果为1,否则为0;                    
var | str     或运算符,比较var和str的对应位,对于每个二进制来
              说,如二都该位有一个1或都是1,结果为1,否则为0;   
   ~var速记;ehco $[ ~var ] 其中var必须先加1,如是负就加1后变正,否则就是加1后变负,           
           逻辑运算符         
  &&  1 1才为1
  ||  有一个1即为1
赋值运算符.+=,==,^=.|=
let count =$count +=$change
             第三节.表达式替换
        也就是刚才用的$[]等同于$(())
            运算符的优先级
级别      运算符         说明
1        =,+=,-=,/=,   
         %=,*=,&=,^=,  赋值运算符
         |=,>==
2          ||           逻辑或
3          &&           逻辑与
4          |            按位或
5          ^            按异位与
6          &            按位与
7          ==,!=        等于/不等于
8         =,     大于或等于/小于或等于/大于/小于
9         >         按位左移/按位右移
10        +,-           加减
11        *,/,%         乘,除,取模
12        ! ,~          逻辑非,按位取反或补码
13        -,+           正负


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18861/showart_112002.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP