Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306251
  • 博文数量: 84
  • 博客积分: 5016
  • 博客等级: 大校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-30 20:22
文章分类

全部博文(84)

文章存档

2008年(21)

2007年(63)

我的朋友

分类:

2007-10-25 23:03:18

    关于这一部分,我实在想不出来给它起什么名字好——毕竟也没有多少值得一写的要点,只好笼统地叫做“变量控制”。
 
一个变量出现在脚本中只有两种形式:
1.为它赋值:
    这种时候不需要在它前面加上$符号。
2.取出它的值(比如用于条件判断、用它的值给其他变量赋值等)
    这种时候要加上$才能表示出它的值。
 
    无论什么时候,如果你在脚本中定义了变量或函数,记得要在脚本结束位置unset它。
 
    位置变量
    对于位置变量,我就不作说明了,举个例子就都明白了
    ls  -a  -h  -R  -l  /etc
    $0  $1  $2  $3  $4   $5
    ——当然,现实中只有“空格癖”患者才会这么写。
 
    赋值
    从终端读入: read  变量名
           或   read  -s  变量名    //加了-s在读入时会屏蔽输入内容
                                   (就像Login状态输入密码时一样)
    赋值语句: 变量名=值
 
    $(COMMAND)
    说实话,我实在想不出给它起什么名字好,因为确实没有一个让人一目了然的名字,只好把它的使用格式拿出来当标题……别让我从书上找它的名字,都怪我读得太快,已经想不起来在哪一章节了……
    它的作用很简单,这个语句会返回括号中指令的输出。
    举个例子,如果用于赋值的话,格式就是:
    aaa=$(ls)
    如果你 echo $aaa 一下就会发现,aaa的值相当于指令ls的输出。
    看到这里,喜欢恶搞的朋友已经发现一个小BUG了吧,没错~~当你赋值aaa=$(ls -R /)时系统会重负很久,如果你没有耐心等待,中途INT掉,你再echo $aaa就会当机,到时候就只能切到其他终端TERM它了。
    当然,这是可以嵌套的,你要知道,这个表达式是个名词~~比如aaa=$(ls $(pwd))
 
    赋值选项
    ${变量名:-内容}              //如果变量存在则返回其值,否则返回“内容”
    ${变量名:=内容}              //如果变量存在则返回其值,否则将“内容”赋予变量并返回其值
    ${变量名:?内容}              //如果变量存在则返回其值,否则在终端提示“内容”
    没有看起来那么晦涩吧,通常这个表达式用作为名词用作赋值或条件判断。
 
    eval
    在我看的资料中,eval向来是放在后边讲的,但我认为没这个必要,智商70+的人都能直接看懂。
    对于它的用法,先看一个例子:
变量A                 
(值)|->  变量B        
(值)|-> 某指令
    若有:
    #!/bin/bash
    B=ls
    A=B
    我们要如何通过对变量A的操作来执行B的值——指令ls呢?
    凭常识可以想到,如果执行$B可以调出ls指令;而$A却不行,因为[ $A = B ] && [ $A != '$B' ]
    但我们试一下就会发现 \$$A 同样行不通,系统会说没有$B这条指令(当然,它在胡扯),主要是因为它把$B认作一个字符串而非一个变量——即'$B',明白了吧?没办法,这毕竟就是转义字符的作用,系统做得没错。
    我们需要做的呢,说起来很简单——就是让shell把\$$A认作一个变量。
    而做起来~~事实上也很简单,在左边加上一个eval就OK了——这就是eval的作用!——让shell尝试将一个字符串当作包含了指令的变量来执行。
    需要注意的是eval总是写在该段语句的最左侧。
 
    顺便一提:
    #!/bin/bash
    B=ls
    A=$B
    可以看出,如果执行$A就可以直接ls了,这次是一个完整的递归——同样递归,echo $A将会显示出$B的内容——字符ls(而不是指令)
    但是这是为什么呢?因为呀~~如果你直接执行$A,shell当然会把$A识别为一个动词去执行,进行了一系列递归之后,它找到了ls,接着自然而然就去执行它——而echo $A中,$A被看作一个名词,递归之后,ls自然也就被看作一个字符串被echo出来了。
    (旁白:真的是这样么?)
    (Zarok:其实我也不知道……)
    (观众: ……)
阅读(955) | 评论(0) | 转发(0) |
0

上一篇:windows自带的截图工具

下一篇:匹配归类

给主人留下些什么吧!~~