shell编程小结(一)
变量
shell编程中使用两种变量:标量变量和数组变量。
变量名只能包含字母、数字、下划线,且只能以字母或下划线开头。以数字开头的变量是
被shell保留使用的,你可使用这些变量的保留值,但不可对此类变量赋值。
8.1.1 标量变量
标量变量按如下格式定义:
name=value
变量值若包含空格时需用双引号或单引号括起。
三、访问变量
访问变量值只需在变量名前加上美元符号$作前缀即可,shell发现$时会执行如下的操作:
1、读取下一单词确定变量名。
2、检索变量的值。若变量没被赋值则用空字串“ ”作为其值。
3、用变量的值取代$和变量名。
这个过程称为“变量置换”。
8.1.2 数组变量
一、建立数组变量:name[index]=value
index必须是一整数,是数组的索引。
若数组名和一个已被定义的标量变量名重名那么标量变量的值就变成数组中索引为0的值。
数组赋值:
数组名[0]=值
数组名[1]=值
连续赋值
bash中格式:数组名=(值1 值2 ....)
zsh中则两种语法都可用。
在bash中设定多重数组元素,需要在值之前建立一数组索引,例:
myarray=([0]=derri [3]=gene [2]=mike [1]=terry)
数组索引不必按顺序。
访问数组的值
格式:${数组名[索引]}
访问数组的所有项可用:${数组名
}或${数组名[@]}
使用“ echo ${数组名
- } ”时,shell会把值中含有空格的一个数组变量看成是几个数
组变量输出,故若数组变量值中含有空格,要用“ echo ${数组名[@]} ”以得到正确的
输出项数。
8.1.3 只读变量
当数组或变量被赋值后,用readonly命令可将其指定为只读数组。
格式:“ readonly 数组名或变量名”
只读数组或变量不能被重新赋值或删除,直到shell退出。
例如:
FRUIT=kiwi
readonly FRUIT
8.1.4 删除变量
格式:unset 变量名(数组名)
不能删除只读变量或只读数组。
常用的shell变量有:
PWD:被cd命令设置,指出当前的工作目录。
UID:详细描述当前用户的数字用户标识符,在shell启动时被初始化。
SHLVL:每次bash打开一个历程就自增1,这个变量的作用是确定内建的exit命令是否闭了
当前会话。
REPLY:若不给定参数,会让read命令读到输入的最后一行,此变量在Bourne shell中无
用。
RANDOM:每次被引用就产生一个介于0到32767之间的随机整数,可通过给$RANDOM赋值来
初始化随机数的顺序,如果$RANDOM被删除,就失去了它的特性,即使后来被重
置。此变量在Bourne shell中无效。
SECONDS:每次参数被引用时,它就返回shell启动的seconds数。如果赋值给$SECONDS,
值在下次引用时返回的是从分配值加上被赋值的seconds数。如果$SECONDS被删
除,就失去了它的特性,即使后来被重置。此变量在Bourne shell中无效。
IFS:描述内部领域分离器被用于扩展之后的词的割裂分析,$IFS也被用来通过read命令
将一行分离成单词。缺省值是字符/t/n, 是空格符号,/t是tab符号,/n是新一
行符号。
PATH:描述命令的搜索路径。它是一个由冒号分隔的shell寻找命令的目录列表。
HOME:当前用户的主目录,缺省设置为cd命令。
以下两个不知是否shell变量:
PS: shell的第二个提示符,提示你已输入一个多行命令,输入并没结束。提示符为“>”。
$?:储存程序的退出码
$-:包含所有shell选顼的列表
变量置换
高级的变量置换分为4种形式:
名称 语法 描述
缺省值置换 ${param:-word} 若param的值为空或未赋值,
word取代param,但param的值不变
------------------------------------------------------------------------
缺省值赋值 ${param:=word} 若param的值为空或未赋值,word
值被赋给param
--------------------------------------------------------------------
空值错误 ${param:?msg} 若param的值为空或未赋值,将msg
信息输出到STDERR,并且退出shell
-------------------------------------------------------------------------
有值置换 ${param:+word} 若param有值,word取代param的值,
但param的值不变
命令置换
格式:`command`
这里command可以是一简单命令,一个管道,或是一个列表。“`”是反引号(键盘上1键
左边)而非单引号。例:
DATE=`date` #date命令的输出变成变量DATE的值
引用
shell对一些特殊符号如$、元字符进行解释处理,但有时需要让shell停止解释处
理,以让每个字符都合符其本意,关闭对特殊符号的解释称为引用
用单引号把整个字符串括起实际上是对整个字符串作引用处理,字符串中的所有元字符失去它们的特殊含义。单引号必须成双
使用,在输出的字符串中包含单引号时,需用反斜线引用。
全部需要引用的元字符有* ? [ ] ' " \ $ ; & ( ) | ^ ! # newline(即\n) tab(即\t)
双引号(")与单引号的不同之处是双引号允许shell对一些元字符(如*;等)作引
用处理,而对某些元字符(如$ ' \ "等)不作引用处理。要输出双引号内不作引用
处理的元字符可用反斜线对其引用。
双引号中反斜线只在以下4个符号之前起作用:“$”、“'”、“"”、“\”。
流控制
if语句
代码返回0表示真,非0为假。语法如下:
if 语句1
then
语句2
elif 语句3
then
语句4
else 语句5
if
test
通常指定给if语句的列表一条或多条test命令。test语法如下:
test expr或[ expr ]
这里expr是test命令所能理解的表达式。开括号([)后和闭括号(])前都要有空格。
test可理解3种主要类型的表达式:文件测试、字符串比较、数字比较。
一、文件测试
语法:test option file 或 [ option file ]
其中option是下列选顼中的一个:
test的文件测试选顼:
选顼 描述
-b file 当file存在且是块文件时返回真
-c file 当file存在且是字符文件时返回真
-d pathname 当pathname存在且是目录时返回真
-c pathname 当pathname指定的文件或目录存在时返回真
-f file 当file存在且是正规文件时返回真
-g pathname 当pathname指定的文件或目录存在并设置了SGID时返回真
-h file 当file存在且是符号链接文件时返回真,在一些老系统上无效
-k pathname 当pathname指定的文件或目录存在并设置了“粘滞”位时返回真
-p file 当file存在且命名管道时返回真
-r pathname 当pathname指定的文件或目录存在并可读时返回真
-s file 当file存在且文件大于0时返回真
-u pathname 当pathname指定的文件或目录存在并设置了SUID时返回真
-w pathname 当pathname指定的文件或目录存在并可写时返回真
-x pathname 当pathname指定的文件或目录存在并可执行时返回真。目录能被访问则
必然是可执行的
-o pathname 当由pathname指定的文件或目录存在且被当前进程的有效用户ID所指定
的用户拥有时返回真。
注意:-x和-w仅测试文件的权限标志,不考虑文件所在的储存介质,故在CD-ROM等介质上
的文件虽可能设置成可写但仍是只读。
二、字符串比较
test和[命令([是test的缩写)允许简单的字符串比较。
test的字符串比较选顼
选顼 描述
-z str 当str长度为0时返回真
-n str 当str长度非0时返回真
str1=str2 当str1和str2相等时返回真
str1!=str2 当str1和str2不等时返回真
例:if [ -z "$a" ];then
.....
if [ "$a"="yes" ]
有时为了避免变量没加引号并且为空时产生错误,会在str1和str2前加一前缀X,则代码变
为: if [ X$a=X"yes" ]
数字比较
语法:test int1 op int2 或 [ int1 op int2 ]
int1和int2可以是正负整数,若为字符串则视为0。这里的op即下面的-eq等选顼。
test的数字比较操作符:
操作符 描述
int1 -eq int2 若int1等于int2,返回真
int1 -ne int2 若int1不等于int2,返回真
int1 -lt int2 若int1小于int2,返回真
int1 -le int2 若int1小于等于int2,返回真
int1 -gt int2 若int1大于int2,返回真
int1 -ge int2 若int1大于等于int2,返回真
注意:=操作符可取代-eq操作符,!=操作符可取代-ne操作符,这常见于一些老系统。
test的数字比较常用于检测程序是否执行成功。其退出码存于变量$?中,0表成功,非0表
执行失败。
复合表达式
语法:
test expr1 op expr2
[ expr1 op expr2 ]
或用条件操作符(&&或||等)这里的op即为&&或||:
test expr1 op test expr2
[ expr1 op expr2 ]
创建复合表达式的操作符:
操作符 描述
!expr expr为假时返回真
expr1 -a expr2 expr1和expr2都为真时返回真
expr1 -o expr2 expr1或expr2为真时返回真
注意:-a和&&即and,-o和||即or。