关于这一部分,我实在想不出来给它起什么名字好——毕竟也没有多少值得一写的要点,只好笼统地叫做“变量控制”。
一个变量出现在脚本中只有两种形式:
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:其实我也不知道……)
(观众: ……)
阅读(981) | 评论(0) | 转发(0) |